Fix calculating light position error
authorHeeyong Song <heeyong.song@samsung.com>
Fri, 1 Nov 2013 06:23:01 +0000 (15:23 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Fri, 1 Nov 2013 06:23:14 +0000 (15:23 +0900)
Change-Id: Iddcb946e0bc395bdd7f83f76090b5b88f099a86c

src/ui/animations/FUiAnim_GlNode.cpp
src/ui/animations/FUiAnim_GlRenderManager.cpp
src/ui/animations/FUiAnim_GlRenderManager.h
src/ui/animations/FUiAnim_LightImpl.cpp
src/ui/animations/FUiAnim_LightImpl.h

index 2740dc0..bd4c98e 100644 (file)
@@ -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)
        {
index 1b01ea7..3672f45 100644 (file)
@@ -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());
index 92f6afa..2e146cb 100644 (file)
@@ -197,9 +197,6 @@ private:
 
                ShaderProgram* __pProgram;
 
-               int __uMVP;
-               int __uOpacity;
-               int __uColor;
                int __aPosition;
                int __aTexCoord;
                int __aColor;
index 7e8a068..1a1c00e 100644 (file)
@@ -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])
 {
index 7da87fb..d48ff1c 100644 (file)
@@ -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;