This is an automated email from the git hooks/post-receive script. odyx pushed a commit to branch debian/master in repository colobot.
commit 12067c1b9f295e4f67c67c5dc1bb3bf24854eba8 Author: Tomasz Kapuściński <[email protected]> Date: Sat Jan 30 18:51:13 2016 +0100 Optimized light updating in CGLDevice --- src/graphics/opengl/gldevice.cpp | 105 ++++++++++++++++++++++++++++++++------- src/graphics/opengl/gldevice.h | 2 + 2 files changed, 89 insertions(+), 18 deletions(-) diff --git a/src/graphics/opengl/gldevice.cpp b/src/graphics/opengl/gldevice.cpp index 5bef6f4..cf0e71e 100644 --- a/src/graphics/opengl/gldevice.cpp +++ b/src/graphics/opengl/gldevice.cpp @@ -447,8 +447,7 @@ void CGLDevice::UpdateModelviewMatrix() if (m_lighting) { - for (int index = 0; index < static_cast<int>( m_lights.size() ); ++index) - UpdateLightPosition(index); + UpdateLightPositions(); } } @@ -501,9 +500,62 @@ void CGLDevice::UpdateLightPosition(int index) assert(index < static_cast<int>( m_lights.size() )); glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + + if (m_lights[index].type == LIGHT_POINT) + { + glLoadIdentity(); + glScalef(1.0f, 1.0f, -1.0f); + glMultMatrixf(m_viewMat.Array()); + + GLfloat position[4] = { m_lights[index].position.x, + m_lights[index].position.y, + m_lights[index].position.z, + 1.0f }; + + glLightfv(GL_LIGHT0 + index, GL_POSITION, position); + } + else + { + glLoadIdentity(); + glScalef(1.0f, 1.0f, -1.0f); + Math::Matrix mat = m_viewMat; + mat.Set(1, 4, 0.0f); + mat.Set(2, 4, 0.0f); + mat.Set(3, 4, 0.0f); + glMultMatrixf(mat.Array()); + + if (m_lights[index].type == LIGHT_SPOT) + { + GLfloat direction[4] = { -m_lights[index].direction.x, + -m_lights[index].direction.y, + -m_lights[index].direction.z, + 1.0f }; + + glLightfv(GL_LIGHT0 + index, GL_SPOT_DIRECTION, direction); + } + else if (m_lights[index].type == LIGHT_DIRECTIONAL) + { + GLfloat position[4] = { -m_lights[index].direction.x, + -m_lights[index].direction.y, + -m_lights[index].direction.z, + 0.0f }; + + glLightfv(GL_LIGHT0 + index, GL_POSITION, position); + } + } + glPopMatrix(); +} + +void CGLDevice::UpdateLightPositions() +{ + glMatrixMode(GL_MODELVIEW); glPushMatrix(); + int lightCount = m_lights.size(); + + // update spotlights and directional lights glLoadIdentity(); glScalef(1.0f, 1.0f, -1.0f); Math::Matrix mat = m_viewMat; @@ -512,25 +564,43 @@ void CGLDevice::UpdateLightPosition(int index) mat.Set(3, 4, 0.0f); glMultMatrixf(mat.Array()); - if (m_lights[index].type == LIGHT_SPOT) + for (int index = 0; index < lightCount; index++) { - GLfloat direction[4] = { -m_lights[index].direction.x, -m_lights[index].direction.y, -m_lights[index].direction.z, 1.0f }; - glLightfv(GL_LIGHT0 + index, GL_SPOT_DIRECTION, direction); - } + if (m_lights[index].type == LIGHT_SPOT) + { + GLfloat direction[4] = { -m_lights[index].direction.x, + -m_lights[index].direction.y, + -m_lights[index].direction.z, + 1.0f }; - if (m_lights[index].type == LIGHT_DIRECTIONAL) - { - GLfloat position[4] = { -m_lights[index].direction.x, -m_lights[index].direction.y, -m_lights[index].direction.z, 0.0f }; - glLightfv(GL_LIGHT0 + index, GL_POSITION, position); + glLightfv(GL_LIGHT0 + index, GL_SPOT_DIRECTION, direction); + } + else if (m_lights[index].type == LIGHT_DIRECTIONAL) + { + GLfloat position[4] = { -m_lights[index].direction.x, + -m_lights[index].direction.y, + -m_lights[index].direction.z, + 0.0f }; + glLightfv(GL_LIGHT0 + index, GL_POSITION, position); + } } - else + + // update point lights + glLoadIdentity(); + glScalef(1.0f, 1.0f, -1.0f); + glMultMatrixf(m_viewMat.Array()); + + for (int index = 0; index < lightCount; index++) { - glLoadIdentity(); - glScalef(1.0f, 1.0f, -1.0f); - glMultMatrixf(m_viewMat.Array()); + if (m_lights[index].type == LIGHT_POINT) + { + GLfloat position[4] = { m_lights[index].position.x, + m_lights[index].position.y, + m_lights[index].position.z, + 1.0f }; - GLfloat position[4] = { m_lights[index].position.x, m_lights[index].position.y, m_lights[index].position.z, 1.0f }; - glLightfv(GL_LIGHT0 + index, GL_POSITION, position); + glLightfv(GL_LIGHT0 + index, GL_POSITION, position); + } } glPopMatrix(); @@ -1858,8 +1928,7 @@ void CGLDevice::SetRenderState(RenderState state, bool enabled) if (enabled) { - for (int index = 0; index < static_cast<int>( m_lights.size() ); ++index) - UpdateLightPosition(index); + UpdateLightPositions(); } return; diff --git a/src/graphics/opengl/gldevice.h b/src/graphics/opengl/gldevice.h index 696e6d6..fe0635c 100644 --- a/src/graphics/opengl/gldevice.h +++ b/src/graphics/opengl/gldevice.h @@ -195,6 +195,8 @@ private: void UpdateModelviewMatrix(); //! Updates position for given light based on transformation matrices void UpdateLightPosition(int index); + //! Updates position for all lights based on transformation matrices + void UpdateLightPositions(); //! Updates the texture params for given texture stage void UpdateTextureParams(int index); -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git _______________________________________________ Pkg-games-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

