Revision: 14960
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14960
Author:   ben2610
Date:     2008-05-25 16:37:39 +0200 (Sun, 25 May 2008)

Log Message:
-----------
Apply BGE patch 11137: Render objects with negative scaling correctly (as in 
Blender)

Modified Paths:
--------------
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
    trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
    trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.h
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
    trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h
    trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp

Modified: 
trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp   
2008-05-25 14:34:03 UTC (rev 14959)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp   
2008-05-25 14:37:39 UTC (rev 14960)
@@ -125,6 +125,22 @@
 
 }
 
+void KX_BlenderRenderTools::SetClientObject(void* obj)
+{
+       if (m_clientobject != obj)
+       {
+               if (obj == NULL || !((KX_GameObject*)obj)->IsNegativeScaling())
+               {
+                       glFrontFace(GL_CCW);
+               } else 
+               {
+                       glFrontFace(GL_CW);
+               }
+               m_clientobject = obj;
+               m_modified = true;
+       }
+}
+
 bool KX_BlenderRenderTools::RayHit(KX_ClientObjectInfo* client, MT_Point3& 
hit_point, MT_Vector3& hit_normal, void * const data)
 {
        double* const oglmatrix = (double* const) data;

Modified: 
trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h     
2008-05-25 14:34:03 UTC (rev 14959)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h     
2008-05-25 14:37:39 UTC (rev 14960)
@@ -105,6 +105,8 @@
 
        virtual void Render2DFilters(RAS_ICanvas* canvas);
 
+       virtual void SetClientObject(void* obj);
+
 };
 
 #endif //__KX_BLENDERRENDERTOOLS

Modified: trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp       
2008-05-25 14:34:03 UTC (rev 14959)
+++ trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp       
2008-05-25 14:37:39 UTC (rev 14960)
@@ -462,6 +462,22 @@
 
 }
 
+void GPC_RenderTools::SetClientObject(void* obj)
+{
+       if (m_clientobject != obj)
+       {
+               if (obj == NULL || !((KX_GameObject*)obj)->IsNegativeScaling())
+               {
+                       glFrontFace(GL_CCW);
+               } else 
+               {
+                       glFrontFace(GL_CW);
+               }
+               m_clientobject = obj;
+               m_modified = true;
+       }
+}
+
 bool GPC_RenderTools::RayHit(KX_ClientObjectInfo* client, MT_Point3& 
hit_point, MT_Vector3& hit_normal, void * const data)
 {
        double* const oglmatrix = (double* const) data;

Modified: trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.h
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.h 
2008-05-25 14:34:03 UTC (rev 14959)
+++ trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.h 
2008-05-25 14:37:39 UTC (rev 14960)
@@ -153,6 +153,8 @@
 
        virtual void Render2DFilters(RAS_ICanvas* canvas);
 
+       virtual void SetClientObject(void* obj);
+
 protected:
        /** 
         * Copied from KX_BlenderGL.cpp in KX_blenderhook

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2008-05-25 
14:34:03 UTC (rev 14959)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2008-05-25 
14:37:39 UTC (rev 14960)
@@ -77,6 +77,7 @@
        m_layer(0),
        m_bSuspendDynamics(false),
        m_bUseObjectColor(false),
+       m_bIsNegativeScaling(false),
        m_bVisible(true),
        m_pPhysicsController1(NULL),
        m_pPhysicsEnvironment(NULL),
@@ -335,7 +336,7 @@
        trans.setBasis(GetSGNode()->GetWorldOrientation());
        
        MT_Vector3 scaling = GetSGNode()->GetWorldScaling();
-       
+       m_bIsNegativeScaling = ((scaling[0] < 0.0) ^ (scaling[1] < 0.0) ^ 
(scaling[2] < 0.0)) ? true : false;
        trans.scale(scaling[0], scaling[1], scaling[2]);
        trans.getValue(fl);
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.h      2008-05-25 
14:34:03 UTC (rev 14959)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.h      2008-05-25 
14:37:39 UTC (rev 14960)
@@ -75,6 +75,7 @@
        
        bool                                                            
m_bSuspendDynamics;
        bool                                                            
m_bUseObjectColor;
+       bool                                                            
m_bIsNegativeScaling;
        MT_Vector4                                                      
m_objectColor;
 
        // Is this object set to be visible? Only useful for the
@@ -599,6 +600,14 @@
        );
                
        /**
+        * Get the negative scaling state
+        */
+               bool
+       IsNegativeScaling(
+               void
+       ) { return m_bIsNegativeScaling; }
+
+       /**
         * @section Logic bubbling methods.
         */
 

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h       
2008-05-25 14:34:03 UTC (rev 14959)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h       
2008-05-25 14:37:39 UTC (rev 14960)
@@ -146,6 +146,7 @@
                int layer
        )=0;
 
+       virtual
                void    
        SetClientObject(
                void* obj

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp   
2008-05-25 14:34:03 UTC (rev 14959)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp   
2008-05-25 14:37:39 UTC (rev 14960)
@@ -325,6 +325,8 @@
                while (ActivateMaterial(cameratrans, rasty, rendertools, 
drawmode))
                        RenderMeshSlot(cameratrans, rasty, rendertools, *it, 
drawmode);
        }
+       // to reset the eventual GL_CW mode
+       rendertools->SetClientObject(NULL);
 }
 
 


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to