[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