From 4b314dcbe20848c78878322fc75919a843d30e0a Mon Sep 17 00:00:00 2001 From: Heeyong Song Date: Fri, 1 Nov 2013 15:23:01 +0900 Subject: [PATCH] Fix calculating light position error Change-Id: Iddcb946e0bc395bdd7f83f76090b5b88f099a86c --- src/ui/animations/FUiAnim_GlNode.cpp | 26 ++++++++++++++++++++++++++ src/ui/animations/FUiAnim_GlRenderManager.cpp | 27 ++++++++++----------------- src/ui/animations/FUiAnim_GlRenderManager.h | 3 --- src/ui/animations/FUiAnim_LightImpl.cpp | 21 +++++++++++++++++++-- src/ui/animations/FUiAnim_LightImpl.h | 6 +++++- 5 files changed, 60 insertions(+), 23 deletions(-) diff --git a/src/ui/animations/FUiAnim_GlNode.cpp b/src/ui/animations/FUiAnim_GlNode.cpp index 2740dc0..bd4c98e 100644 --- a/src/ui/animations/FUiAnim_GlNode.cpp +++ b/src/ui/animations/FUiAnim_GlNode.cpp @@ -413,6 +413,27 @@ _GlNode::SyncStatus(VisualElementSurface* pSurface, _VisualElementImpl& element) __pLight = new (std::nothrow) Light(*pLight); } } + + _LightImpl* pLightImpl = _LightImpl::GetInstance(*__pLight); + + float position[4]; + float* pPosition = pLightImpl->GetPosition(); + + position[0] = (__transform.matrix[0][0] * pPosition[0]) + (__transform.matrix[1][0] * pPosition[1]) + + (__transform.matrix[2][0] * pPosition[2]) + (__transform.matrix[3][0] * pPosition[3]); + position[1] = (__transform.matrix[0][1] * pPosition[0]) + (__transform.matrix[1][1] * pPosition[1]) + + (__transform.matrix[2][1] * pPosition[2]) + (__transform.matrix[3][1] * pPosition[3]); + position[2] = (__transform.matrix[0][2] * pPosition[0]) + (__transform.matrix[1][2] * pPosition[1]) + + (__transform.matrix[2][2] * pPosition[2]) + (__transform.matrix[3][2] * pPosition[3]); + position[3] = (__transform.matrix[0][3] * pPosition[0]) + (__transform.matrix[1][3] * pPosition[1]) + + (__transform.matrix[2][3] * pPosition[2]) + (__transform.matrix[3][3] * pPosition[3]); + + pLightImpl->SetWorldPosition(position); + } + else + { + delete __pLight; + __pLight = null; } Material* pMaterial =element.GetSharedData().geometry.GetMaterial(); @@ -432,6 +453,11 @@ _GlNode::SyncStatus(VisualElementSurface* pSurface, _VisualElementImpl& element) } } } + else + { + delete __pMaterial; + __pMaterial = null; + } if (element.__decomposedMatrixToTop.GetMatrixType() >= MATRIX4_Scale || __pMesh) { diff --git a/src/ui/animations/FUiAnim_GlRenderManager.cpp b/src/ui/animations/FUiAnim_GlRenderManager.cpp index 1b01ea7..3672f45 100644 --- a/src/ui/animations/FUiAnim_GlRenderManager.cpp +++ b/src/ui/animations/FUiAnim_GlRenderManager.cpp @@ -110,9 +110,6 @@ _GlRenderManager::_RenderObject::_RenderObject(void) , __pIndices(null) , __vertexCount(0) , __pProgram(null) - , __uMVP(-1) - , __uOpacity(-1) - , __uColor(-1) , __aPosition(-1) , __aTexCoord(-1) , __aColor(-1) @@ -375,10 +372,6 @@ _GlRenderManager::_RenderObject::SetObject(_GlNode* pNode, const _Matrix3Df& mvp _ShaderProgramImpl* pProgramImpl = _ShaderProgramImpl::GetInstance(*__pProgram); - __uMVP = pProgramImpl->__uniformLocation[UNIFORM_MAT4_MVP]; - __uOpacity = pProgramImpl->__uniformLocation[UNIFORM_FLOAT_OPACITY]; - __uColor = pProgramImpl->__uniformLocation[UNIFORM_VEC4_COLOR]; - __aPosition = pProgramImpl->__attributeLocation[ATTRIBUTE_VEC4_POSITION]; __aTexCoord = pProgramImpl->__attributeLocation[ATTRIBUTE_VEC2_TEXTURE_COORD]; __aColor = pProgramImpl->__attributeLocation[ATTRIBUTE_VEC4_COLOR]; @@ -734,21 +727,21 @@ _GlRenderManager::FlushRenderQueue(void) __pGlContext->UseShaderProgram(__pRenderQueue[i].__pProgram); - // Set uniform - glUniformMatrix4fv(__pRenderQueue[i].__uMVP, 1, GL_FALSE, __pRenderQueue[i].__mvp.GetItems()); - glUniform1f(__pRenderQueue[i].__uOpacity, __pRenderQueue[i].__opacity); - glUniform4f(__pRenderQueue[i].__uColor, __pRenderQueue[i].__objectColor.Red(), __pRenderQueue[i].__objectColor.Green(), - __pRenderQueue[i].__objectColor.Blue(), __pRenderQueue[i].__objectColor.Alpha()); - - glUniformMatrix4fv(pProgramImpl->__uniformLocation[UNIFORM_MAT4_MODEL_VIEW], 1, GL_FALSE, __pRenderQueue[i].__modelview.GetItems()); - glUniformMatrix4fv(pProgramImpl->__uniformLocation[UNIFORM_MAT4_INV_MODEL_VIEW], 1, GL_FALSE, __pRenderQueue[i].__invModelview.GetItems()); - // Set attribute glVertexAttribPointer(__pRenderQueue[i].__aPosition, 3, GL_FLOAT, GL_FALSE, VERTEX_BUFFER_STRIDE * sizeof(float), __pRenderQueue[i].__pVertices); glVertexAttribPointer(__pRenderQueue[i].__aTexCoord, 2, GL_FLOAT, GL_FALSE, TEX_COORD_BUFFER_STRIDE * sizeof(float), __pRenderQueue[i].__pTexCoords); glVertexAttribPointer(__pRenderQueue[i].__aColor, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), __pRenderQueue[i].__pColors); glVertexAttribPointer(__pRenderQueue[i].__aNormal, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), __pRenderQueue[i].__pNormals); + // Set uniform + glUniformMatrix4fv(pProgramImpl->__uniformLocation[UNIFORM_MAT4_MVP], 1, GL_FALSE, __pRenderQueue[i].__mvp.GetItems()); + glUniform1f(pProgramImpl->__uniformLocation[UNIFORM_FLOAT_OPACITY], __pRenderQueue[i].__opacity); + glUniform4f(pProgramImpl->__uniformLocation[UNIFORM_VEC4_COLOR], __pRenderQueue[i].__objectColor.Red(), __pRenderQueue[i].__objectColor.Green(), + __pRenderQueue[i].__objectColor.Blue(), __pRenderQueue[i].__objectColor.Alpha()); + + glUniformMatrix4fv(pProgramImpl->__uniformLocation[UNIFORM_MAT4_MODEL_VIEW], 1, GL_FALSE, __pRenderQueue[i].__modelview.GetItems()); + glUniformMatrix4fv(pProgramImpl->__uniformLocation[UNIFORM_MAT4_INV_MODEL_VIEW], 1, GL_FALSE, __pRenderQueue[i].__invModelview.GetItems()); + if (__pRenderQueue[i].__pLight) { _LightImpl* pLightImpl = _LightImpl::GetInstance(*__pRenderQueue[i].__pLight); @@ -757,7 +750,7 @@ _GlRenderManager::FlushRenderQueue(void) glUniform4fv(pProgramImpl->__uniformLocation[UNIFORM_VEC4_LIGHT_AMBIENT], 1, pLightImpl->GetAmbient()); glUniform4fv(pProgramImpl->__uniformLocation[UNIFORM_VEC4_LIGHT_DIFFUSE], 1, pLightImpl->GetDiffuse()); glUniform4fv(pProgramImpl->__uniformLocation[UNIFORM_VEC4_LIGHT_SPECULAR], 1, pLightImpl->GetSpecular()); - glUniform4fv(pProgramImpl->__uniformLocation[UNIFORM_VEC4_LIGHT_POSITION], 1, pLightImpl->GetPosition()); + glUniform4fv(pProgramImpl->__uniformLocation[UNIFORM_VEC4_LIGHT_POSITION], 1, pLightImpl->GetWorldPosition()); glUniform3fv(pProgramImpl->__uniformLocation[UNIFORM_VEC3_LIGHT_DIRECTION], 1, pLightImpl->GetDirection()); glUniform1f(pProgramImpl->__uniformLocation[UNIFORM_FLOAT_LIGHT_EXPONENT], pLightImpl->GetExponent()); glUniform1f(pProgramImpl->__uniformLocation[UNIFORM_FLOAT_LIGHT_CUTOFF], pLightImpl->GetCutOff()); diff --git a/src/ui/animations/FUiAnim_GlRenderManager.h b/src/ui/animations/FUiAnim_GlRenderManager.h index 92f6afa..2e146cb 100644 --- a/src/ui/animations/FUiAnim_GlRenderManager.h +++ b/src/ui/animations/FUiAnim_GlRenderManager.h @@ -197,9 +197,6 @@ private: ShaderProgram* __pProgram; - int __uMVP; - int __uOpacity; - int __uColor; int __aPosition; int __aTexCoord; int __aColor; diff --git a/src/ui/animations/FUiAnim_LightImpl.cpp b/src/ui/animations/FUiAnim_LightImpl.cpp index 7e8a068..1a1c00e 100644 --- a/src/ui/animations/FUiAnim_LightImpl.cpp +++ b/src/ui/animations/FUiAnim_LightImpl.cpp @@ -39,8 +39,9 @@ _LightImpl::_LightImpl(void) __specular[0] = 1.0f; __specular[1] = 1.0f; __specular[2] = 1.0f; __specular[3] = 1.0f; __position[0] = 0.0f; __position[1] = 0.0f; __position[2] = 1.0f; __position[3] = 0.0f; - __direction[0] = 0.0f; __direction[1] = 0.0f; __direction[2] = -1.0f; + __worldPosition[0] = 0.0f; __worldPosition[1] = 0.0f; __worldPosition[2] = 1.0f; __worldPosition[3] = 0.0f; + __direction[0] = 0.0f; __direction[1] = 0.0f; __direction[2] = -1.0f; __attenuation[0] = 1.0f; __attenuation[1] = 0.0f; __attenuation[2] = 0.0f; } @@ -56,8 +57,9 @@ _LightImpl::_LightImpl(const _LightImpl& src) memcpy(__specular, src.__specular, sizeof(__specular)); memcpy(__position, src.__position, sizeof(__position)); - memcpy(__direction, src.__direction, sizeof(__direction)); + memcpy(__worldPosition, src.__worldPosition, sizeof(__worldPosition)); + memcpy(__direction, src.__direction, sizeof(__direction)); memcpy(__attenuation, src.__attenuation, sizeof(__attenuation)); } @@ -137,6 +139,21 @@ _LightImpl::GetPosition(void) const return (float*)__position; } +float +_LightImpl::SetWorldPosition(const float position[4]) +{ + __worldPosition[0] = position[0]; + __worldPosition[1] = position[1]; + __worldPosition[2] = position[2]; + __worldPosition[3] = position[3]; +} + +float* +_LightImpl::GetWorldPosition(void) const +{ + return (float*)__worldPosition; +} + void _LightImpl::SetDirection(const float direction[3]) { diff --git a/src/ui/animations/FUiAnim_LightImpl.h b/src/ui/animations/FUiAnim_LightImpl.h index 7da87fb..d48ff1c 100644 --- a/src/ui/animations/FUiAnim_LightImpl.h +++ b/src/ui/animations/FUiAnim_LightImpl.h @@ -157,6 +157,9 @@ public: */ float* GetPosition(void) const; + float SetWorldPosition(const float position[4]); + float* GetWorldPosition(void) const; + /** * Sets light direction. * @@ -282,8 +285,9 @@ private: float __specular[4]; float __position[4]; - float __direction[3]; + float __worldPosition[4]; + float __direction[3]; float __exponent; float __cutOff; -- 2.7.4