diff options
Diffstat (limited to 'src/graphics/opengl')
-rw-r--r-- | src/graphics/opengl/gldevice.cpp | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/src/graphics/opengl/gldevice.cpp b/src/graphics/opengl/gldevice.cpp index 29a0104..bffbc3a 100644 --- a/src/graphics/opengl/gldevice.cpp +++ b/src/graphics/opengl/gldevice.cpp @@ -307,9 +307,8 @@ void CGLDevice::SetLight(int index, const Light &light) if (light.type == LIGHT_SPOT) { - // TODO: fix spotlight problems - //glLightf(GL_LIGHT0 + index, GL_SPOT_CUTOFF, light.spotAngle); - //glLightf(GL_LIGHT0 + index, GL_SPOT_EXPONENT, light.spotIntensity); + glLightf(GL_LIGHT0 + index, GL_SPOT_CUTOFF, light.spotAngle); + glLightf(GL_LIGHT0 + index, GL_SPOT_EXPONENT, light.spotIntensity); } else { @@ -330,25 +329,33 @@ void CGLDevice::UpdateLightPosition(int index) glLoadIdentity(); glScalef(1.0f, 1.0f, -1.0f); - glMultMatrixf(m_viewMat.Array()); + 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); + } 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 }; + 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 { + 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); } - 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, 0.0f }; - glLightfv(GL_LIGHT0 + index, GL_SPOT_DIRECTION, direction); - } - glPopMatrix(); } @@ -367,7 +374,10 @@ void CGLDevice::SetLightEnabled(int index, bool enabled) m_lightsEnabled[index] = enabled; - glEnable(GL_LIGHT0 + index); + if (enabled) + glEnable(GL_LIGHT0 + index); + else + glDisable(GL_LIGHT0 + index); } bool CGLDevice::GetLightEnabled(int index) |