Revision: 14629
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14629
Author:   ben2610
Date:     2008-04-30 21:58:44 +0200 (Wed, 30 Apr 2008)

Log Message:
-----------
fix BGE bug #8869: Added objects are not lit correctly

The current layer information is now stored in KX_GameObject and inherited from 
the parent object when dynamically added. This information is used during the 
rendering the select the lamps. As the selected lamps are always coming from 
active layers, their position and orientation are correct. 

Modified Paths:
--------------
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
    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-04-30 18:30:11 UTC (rev 14628)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp   
2008-04-30 19:58:44 UTC (rev 14629)
@@ -91,6 +91,10 @@
        {
                if (m_clientobject)
                {
+                       if (layer == RAS_LIGHT_OBJECT_LAYER)
+                       {
+                               layer = 
static_cast<KX_GameObject*>(m_clientobject)->GetLayer();
+                       }
                        if (applyLights(layer))
                        {
                                EnableOpenGLLights();

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp      
2008-04-30 18:30:11 UTC (rev 14628)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp      
2008-04-30 19:58:44 UTC (rev 14629)
@@ -1680,8 +1680,11 @@
                break;
        }
        }
-       if (gameobj)
+       if (gameobj) 
+       {
                
gameobj->SetPhysicsEnvironment(kxscene->GetPhysicsEnvironment());
+               gameobj->SetLayer(ob->lay);
+       }
        return gameobj;
 }
 

Modified: trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp       
2008-04-30 18:30:11 UTC (rev 14628)
+++ trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp       
2008-04-30 19:58:44 UTC (rev 14629)
@@ -137,6 +137,10 @@
        {
                if (m_clientobject)
                {       
+                       if (layer == RAS_LIGHT_OBJECT_LAYER)
+                       {
+                               layer = 
static_cast<KX_GameObject*>(m_clientobject)->GetLayer();
+                       }
                        if (applyLights(layer))
                        {
                                EnableOpenGLLights();

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2008-04-30 
18:30:11 UTC (rev 14628)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2008-04-30 
19:58:44 UTC (rev 14629)
@@ -74,6 +74,7 @@
 ) : 
        SCA_IObject(T),
        m_bDyna(false),
+       m_layer(0),
        m_bSuspendDynamics(false),
        m_bUseObjectColor(false),
        m_bVisible(true),
@@ -479,6 +480,22 @@
        m_bVisible = v;
 }
 
+void
+KX_GameObject::SetLayer(
+       int l
+       )
+{
+       m_layer = l;
+}
+
+int
+KX_GameObject::GetLayer(
+       void
+       )
+{
+       return m_layer;
+}
+
 // used by Python, and the actuatorshould _not_ be misused by the
 // scene!
 void 

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.h      2008-04-30 
18:30:11 UTC (rev 14628)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.h      2008-04-30 
19:58:44 UTC (rev 14629)
@@ -70,6 +70,7 @@
        KX_ClientObjectInfo*                            m_pClient_info;
        STR_String                                                      m_name;
        STR_String                                                      m_text;
+       int                                                                     
m_layer;
        std::vector<RAS_MeshObject*>            m_meshes;
        
        bool                                                            
m_bSuspendDynamics;
@@ -571,6 +572,22 @@
                bool b
        );
 
+       /**
+        * Change the layer of the object (when it is added in another layer
+        * than the original layer)
+        */
+               void
+       SetLayer(
+               int l
+       );
+
+       /**
+        * Get the object layer
+        */
+               int
+       GetLayer(
+               void
+       );
                
        /**
         * @section Logic bubbling methods.

Modified: trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp 2008-04-30 18:30:11 UTC 
(rev 14628)
+++ trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp 2008-04-30 19:58:44 UTC 
(rev 14629)
@@ -650,6 +650,8 @@
        for (git = 
m_logicHierarchicalGameObjects.begin();!(git==m_logicHierarchicalGameObjects.end());++git)
        {
                (*git)->Relink(&m_map_gameobject_to_replica);
+               // add the object in the layer of the parent
+               (*git)->SetLayer(parentobj->GetLayer());
        }
 
        // now replicate logic

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h       
2008-04-30 18:30:11 UTC (rev 14628)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h       
2008-04-30 19:58:44 UTC (rev 14629)
@@ -61,6 +61,10 @@
                RAS_TEXT_PADDED,
                RAS_TEXT_MAX
        };
+       enum RAS_LIGHT_MODE {
+               RAS_LIGHT_NONE = -1,
+               RAS_LIGHT_OBJECT_LAYER = 0
+       };
 
        RAS_IRenderTools(
        ) :

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp   
2008-04-30 18:30:11 UTC (rev 14628)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp   
2008-04-30 19:58:44 UTC (rev 14629)
@@ -189,7 +189,7 @@
        }
        else
        {
-               rendertools->ProcessLighting(m_material->GetLightLayer());
+               
rendertools->ProcessLighting(RAS_IRenderTools::RAS_LIGHT_OBJECT_LAYER/*m_material->GetLightLayer()*/);
        }
 
        drawmode = (rasty->GetDrawingMode()  < RAS_IRasterizer::KX_SOLID ?      
@@ -204,7 +204,6 @@
        if (!ms.m_bVisible)
                return;
        
-       rendertools->SetClientObject(ms.m_clientObj);
        m_material->ActivateMeshSlot(ms, rasty);
 
        /* __NLA Do the deformation */
@@ -317,15 +316,12 @@
 
        //rasty->SetMaterial(*m_material);
        
-       if (m_meshSlots.size() >0)
-       {
-               
rendertools->SetClientObject((*m_meshSlots.begin()).m_clientObj);
-       }
        
        int drawmode;
        for (T_MeshSlotList::const_iterator it = m_meshSlots.begin();
        ! (it == m_meshSlots.end()); ++it)
        {
+               rendertools->SetClientObject((*it).m_clientObj);
                while (ActivateMaterial(cameratrans, rasty, rendertools, 
drawmode))
                        RenderMeshSlot(cameratrans, rasty, rendertools, *it, 
drawmode);
        }


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

Reply via email to