[Scummvm-git-logs] scummvm master -> 7dbf9c2b33196e2f6a08b3284d59b83fd58e4b35

aquadran aquadran at gmail.com
Tue Oct 19 14:30:16 UTC 2021


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
7dbf9c2b33 STARK: Move static portions of light calculations outside vertex loop


Commit: 7dbf9c2b33196e2f6a08b3284d59b83fd58e4b35
    https://github.com/scummvm/scummvm/commit/7dbf9c2b33196e2f6a08b3284d59b83fd58e4b35
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2021-10-19T16:30:09+02:00

Commit Message:
STARK: Move static portions of light calculations outside vertex loop

Changed paths:
    engines/stark/gfx/openglactor.cpp
    engines/stark/gfx/openglprop.cpp


diff --git a/engines/stark/gfx/openglactor.cpp b/engines/stark/gfx/openglactor.cpp
index 8db52bec28..9eec6a2afc 100644
--- a/engines/stark/gfx/openglactor.cpp
+++ b/engines/stark/gfx/openglactor.cpp
@@ -47,6 +47,8 @@ OpenGLActorRenderer::~OpenGLActorRenderer() {
 }
 
 void OpenGLActorRenderer::render(const Math::Vector3d &position, float direction, const LightEntryArray &lights) {
+	static const uint maxLights = 10;
+
 	if (_modelIsDirty) {
 		clearVertices();
 		uploadVertices();
@@ -101,6 +103,24 @@ void OpenGLActorRenderer::render(const Math::Vector3d &position, float direction
 		lightDirection = getShadowLightDirection(lights, position, modelInverse.getRotation());
 	}
 
+	Math::Vector4d worldPosition[maxLights];
+	Math::Vector4d lightEyePosition[maxLights];
+	Math::Vector3d lightEyeDirection[maxLights];
+	if (_gfx->computeLightsEnabled()) {
+		for (uint li = 0; li < lights.size() - 1; li++) {
+			const LightEntry *l = lights[li + 1];
+
+			worldPosition[li].x() = l->position.x();
+			worldPosition[li].y() = l->position.y();
+			worldPosition[li].z() = l->position.z();
+			worldPosition[li].w() = 1.0f;
+
+			lightEyePosition[li] = view * worldPosition[li];
+			lightEyeDirection[li] = view.getRotation() * l->direction;
+			lightEyeDirection[li].normalize();
+		}
+	}
+
 	glEnable(GL_TEXTURE_2D);
 
 	Common::Array<Face *> faces = _model->getFaces();
@@ -194,9 +214,6 @@ void OpenGLActorRenderer::render(const Math::Vector3d &position, float direction
 			}
 
 			if (_gfx->computeLightsEnabled()) {
-				Math::Vector4d worldPosition = Math::Vector4d(0.0, 0.0, 0.0, 1.0);
-				static const uint maxLights = 10;
-
 				assert(lights.size() >= 1);
 				assert(lights.size() <= maxLights);
 
@@ -208,17 +225,9 @@ void OpenGLActorRenderer::render(const Math::Vector3d &position, float direction
 				for (uint li = 0; li < lights.size() - 1; li++) {
 					const LightEntry *l = lights[li + 1];
 
-					worldPosition.x() = l->position.x();
-					worldPosition.y() = l->position.y();
-					worldPosition.z() = l->position.z();
-
-					Math::Vector4d lightEyePosition = view * worldPosition;
-					Math::Vector3d lightEyeDirection = view.getRotation() * l->direction;
-					lightEyeDirection.normalize();
-
 					switch (l->type) {
 						case LightEntry::kPoint: {
-							Math::Vector3d vertexToLight = lightEyePosition.getXYZ() - modelEyePosition.getXYZ();
+							Math::Vector3d vertexToLight = lightEyePosition[li].getXYZ() - modelEyePosition.getXYZ();
 
 							float dist = vertexToLight.length();
 							vertexToLight.normalize();
@@ -228,12 +237,12 @@ void OpenGLActorRenderer::render(const Math::Vector3d &position, float direction
 							break;
 						}
 						case LightEntry::kDirectional: {
-							float incidence = MAX(0.0f, Math::Vector3d::dotProduct(modelEyeNormal, -lightEyeDirection));
+							float incidence = MAX(0.0f, Math::Vector3d::dotProduct(modelEyeNormal, -lightEyeDirection[li]));
 							lightColor += (l->color * incidence);
 							break;
 						}
 						case LightEntry::kSpot: {
-							Math::Vector3d vertexToLight = lightEyePosition.getXYZ() - modelEyePosition.getXYZ();
+							Math::Vector3d vertexToLight = lightEyePosition[li].getXYZ() - modelEyePosition.getXYZ();
 
 							float dist = vertexToLight.length();
 							float attn = CLIP((l->falloffFar - dist) / MAX(0.001f, l->falloffFar - l->falloffNear), 0.0f, 1.0f);
@@ -241,7 +250,7 @@ void OpenGLActorRenderer::render(const Math::Vector3d &position, float direction
 							vertexToLight.normalize();
 							float incidence = MAX(0.0f, modelEyeNormal.dotProduct(vertexToLight));
 
-							float cosAngle = MAX(0.0f, vertexToLight.dotProduct(-lightEyeDirection));
+							float cosAngle = MAX(0.0f, vertexToLight.dotProduct(-lightEyeDirection[li]));
 							float cone = CLIP((cosAngle - l->innerConeAngle.getCosine()) / MAX(0.001f, l->outerConeAngle.getCosine() - l->innerConeAngle.getCosine()), 0.0f, 1.0f);
 
 							lightColor += l->color * attn * incidence * cone;
diff --git a/engines/stark/gfx/openglprop.cpp b/engines/stark/gfx/openglprop.cpp
index 8dac044404..25b0e4031a 100644
--- a/engines/stark/gfx/openglprop.cpp
+++ b/engines/stark/gfx/openglprop.cpp
@@ -44,6 +44,8 @@ OpenGLPropRenderer::~OpenGLPropRenderer() {
 }
 
 void OpenGLPropRenderer::render(const Math::Vector3d &position, float direction, const LightEntryArray &lights) {
+	static const uint maxLights = 10;
+
 	if (_modelIsDirty) {
 		clearVertices();
 		uploadVertices();
@@ -77,6 +79,24 @@ void OpenGLPropRenderer::render(const Math::Vector3d &position, float direction,
 		normalMatrix.invertAffineOrthonormal();
 	}
 
+	Math::Vector4d worldPosition[maxLights];
+	Math::Vector4d lightEyePosition[maxLights];
+	Math::Vector3d lightEyeDirection[maxLights];
+	if (_gfx->computeLightsEnabled()) {
+		for (uint li = 0; li < lights.size() - 1; li++) {
+			const LightEntry *l = lights[li + 1];
+
+			worldPosition[li].x() = l->position.x();
+			worldPosition[li].y() = l->position.y();
+			worldPosition[li].z() = l->position.z();
+			worldPosition[li].w() = 1.0f;
+
+			lightEyePosition[li] = view * worldPosition[li];
+			lightEyeDirection[li] = view.getRotation() * l->direction;
+			lightEyeDirection[li].normalize();
+		}
+	}
+
 	const Common::Array<Face> &faces = _model->getFaces();
 	const Common::Array<Material> &materials = _model->getMaterials();
 
@@ -122,7 +142,6 @@ void OpenGLPropRenderer::render(const Math::Vector3d &position, float direction,
 				Math::Vector4d modelEyePosition = modelViewMatrix * Math::Vector4d(vertex.x, vertex.y, vertex.z, 1.0);
 				Math::Vector3d modelEyeNormal = normalMatrix.getRotation() *  Math::Vector3d(vertex.nx, vertex.ny, vertex.nz);
 				modelEyeNormal.normalize();
-				Math::Vector4d worldPosition = Math::Vector4d(0.0, 0.0, 0.0, 1.0);
 
 				static const uint maxLights = 10;
 
@@ -137,17 +156,9 @@ void OpenGLPropRenderer::render(const Math::Vector3d &position, float direction,
 				for (uint li = 0; li < lights.size() - 1; li++) {
 					const LightEntry *l = lights[li + 1];
 
-					worldPosition.x() = l->position.x();
-					worldPosition.y() = l->position.y();
-					worldPosition.z() = l->position.z();
-
-					Math::Vector4d lightEyePosition = view * worldPosition;
-					Math::Vector3d lightEyeDirection = view.getRotation() * l->direction;
-					lightEyeDirection.normalize();
-
 					switch (l->type) {
 						case LightEntry::kPoint: {
-							Math::Vector3d vertexToLight = lightEyePosition.getXYZ() - modelEyePosition.getXYZ();
+							Math::Vector3d vertexToLight = lightEyePosition[li].getXYZ() - modelEyePosition.getXYZ();
 
 							float dist = vertexToLight.length();
 							vertexToLight.normalize();
@@ -157,12 +168,12 @@ void OpenGLPropRenderer::render(const Math::Vector3d &position, float direction,
 							break;
 						}
 						case LightEntry::kDirectional: {
-							float incidence = MAX(0.0f, Math::Vector3d::dotProduct(modelEyeNormal, -lightEyeDirection));
+							float incidence = MAX(0.0f, Math::Vector3d::dotProduct(modelEyeNormal, -lightEyeDirection[li]));
 							lightColor += (l->color * incidence);
 							break;
 						}
 						case LightEntry::kSpot: {
-							Math::Vector3d vertexToLight = lightEyePosition.getXYZ() - modelEyePosition.getXYZ();
+							Math::Vector3d vertexToLight = lightEyePosition[li].getXYZ() - modelEyePosition.getXYZ();
 
 							float dist = vertexToLight.length();
 							float attn = CLIP((l->falloffFar - dist) / MAX(0.001f, l->falloffFar - l->falloffNear), 0.0f, 1.0f);
@@ -170,7 +181,7 @@ void OpenGLPropRenderer::render(const Math::Vector3d &position, float direction,
 							vertexToLight.normalize();
 							float incidence = MAX(0.0f, modelEyeNormal.dotProduct(vertexToLight));
 
-							float cosAngle = MAX(0.0f, vertexToLight.dotProduct(-lightEyeDirection));
+							float cosAngle = MAX(0.0f, vertexToLight.dotProduct(-lightEyeDirection[li]));
 							float cone = CLIP((cosAngle - l->innerConeAngle.getCosine()) / MAX(0.001f, l->outerConeAngle.getCosine() - l->innerConeAngle.getCosine()), 0.0f, 1.0f);
 
 							lightColor += l->color * attn * incidence * cone;




More information about the Scummvm-git-logs mailing list