Commit: 514c53ef81ca0e332414b10bab5b33a8311445d1
Author: Ines Almeida
Date:   Thu Jul 24 19:00:19 2014 +0100
Branches: soc-2014-bge
https://developer.blender.org/rB514c53ef81ca0e332414b10bab5b33a8311445d1

game engine: scenegraph cleanup

===================================================================

M       source/gameengine/Converter/BL_BlenderDataConversion.cpp
M       source/gameengine/Ketsji/KX_GameObject.cpp
M       source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp

===================================================================

diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp 
b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index 4f8daa5..7966d6a 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -161,7 +161,6 @@ extern Material defmaterial;        /* material.c */
 
 #include "SG_Node.h"
 #include "SG_BBox.h"
-#include "SG_Tree.h"
 #include "KX_SG_NodeRelationships.h"
 #include "KX_SG_BoneParentNodeRelationship.h"
 
@@ -1746,15 +1745,22 @@ static KX_GameObject* getGameOb(STR_String 
busc,CListValue* sumolist)
  * note: all var names match args are passed from the caller */
 static void bl_ConvertBlenderObject_Single(
         KX_BlenderSceneConverter *converter,
-       Object *blenderobject,
+        Object *blenderobject,
         vector<parentChildLink> &vec_parent_child,
         CListValue* logicbrick_conversionlist,
-        CListValue* objectlist, CListValue* inactivelist, CListValue*  
sumolist,
+        CListValue* objectlist, CListValue* inactivelist, CListValue* sumolist,
         KX_Scene* kxscene, KX_GameObject* gameobj,
         SCA_LogicManager* logicmgr, SCA_TimeEventManager* timemgr,
         bool isInActiveLayer
         )
 {
+       sumolist->Add(gameobj->AddRef());
+
+       
BL_ConvertProperties(blenderobject,gameobj,timemgr,kxscene,isInActiveLayer);
+
+       gameobj->SetName(blenderobject->id.name + 2);
+
+       /* Setting local coordinates according to current local+delta */
        MT_Point3 pos(
                blenderobject->loc[0]+blenderobject->dloc[0],
                blenderobject->loc[1]+blenderobject->dloc[1],
@@ -1775,33 +1781,38 @@ static void bl_ConvertBlenderObject_Single(
        gameobj->NodeSetLocalPosition(pos);
        gameobj->NodeSetLocalOrientation(rotation);
        gameobj->NodeSetLocalScale(scale);
-       gameobj->NodeUpdateGS(0);
-
-       sumolist->Add(gameobj->AddRef());
-
-       
BL_ConvertProperties(blenderobject,gameobj,timemgr,kxscene,isInActiveLayer);
-
-       gameobj->SetName(blenderobject->id.name + 2);
 
-       // update children/parent hierarchy
+       /* if the node has a parent, add a parent/child link */
        if (blenderobject->parent != 0)
        {
-               // blender has an additional 'parentinverse' offset in each 
object
-               SG_Callbacks 
callback(NULL,NULL,NULL,KX_Scene::KX_ScenegraphUpdateFunc,KX_Scene::KX_ScenegraphRescheduleFunc);
-               SG_Node* parentinversenode = new SG_Node(NULL,kxscene,callback);
-
-               // define a normal parent relationship for this node.
-               KX_NormalParentRelation * parent_relation = 
KX_NormalParentRelation::New();
-               parentinversenode->SetParentRelation(parent_relation);
+               SG_Callbacks callbacks(
+                           NULL, /* replicationfunc, */
+                           NULL, /* destructionfunc,*/
+                           NULL, /* updatefunc, */
+                           KX_Scene::KX_ScenegraphUpdateFunc, /* schedulefunc, 
*/
+                           KX_Scene::KX_ScenegraphRescheduleFunc); /* 
reschedulefunc */
+
+               /*
+                * when an object gets parented, an inverse parenting matrix is 
kept,
+                * or the child would pop to the parents position, alignment, 
etc.
+                * the GE scene graph makes an intermediate node between the 
parent
+                * and child to store this transform.
+                */
+               SG_Node* parentinversenode = new 
SG_Node(NULL,kxscene,callbacks);
+               
parentinversenode->SetParentRelation(KX_NormalParentRelation::New());
+               parentinversenode->AddChild(gameobj->GetSGNode());
 
+               /* add the link to vec_parent_child that will be processed 
later, connecting the parent nodes */
                parentChildLink pclink;
                pclink.m_blenderchild = blenderobject;
                pclink.m_gamechildnode = parentinversenode;
                vec_parent_child.push_back(pclink);
 
+               /* extract location, orientation and scale out of the inverse 
parent matrix */
                float* fl = (float*) blenderobject->parentinv;
                MT_Transform parinvtrans(fl);
                parentinversenode->SetLocalPosition(parinvtrans.getOrigin());
+
                // problem here: the parent inverse transform combines scaling 
and rotation
                // in the basis but the scenegraph needs separate rotation and 
scaling.
                // This is not important for OpenGL (it uses 4x4 matrix) but it 
is important
@@ -1825,10 +1836,12 @@ static void bl_ConvertBlenderObject_Single(
                ori.setColumn(2, z);
                parentinversenode->SetLocalOrientation(ori);
                parentinversenode->SetLocalScale(parscale);
-
-               parentinversenode->AddChild(gameobj->GetSGNode());
        }
 
+       /* Note: world coordinates are calculated for all nodes when the scene 
graph
+        * is complete, after processing vec_parent_child */
+
+
        // needed for python scripting
        logicmgr->RegisterGameObjectName(gameobj->GetName(),gameobj);
 
@@ -1843,12 +1856,10 @@ static void bl_ConvertBlenderObject_Single(
 
        logicbrick_conversionlist->Add(gameobj->AddRef());
 
+
        if (isInActiveLayer)
        {
                objectlist->Add(gameobj->AddRef());
-               //tf.Add(gameobj->GetSGNode());
-
-               gameobj->NodeUpdateGS(0);
                gameobj->AddMeshUser();
        }
        else
@@ -1942,24 +1953,25 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
        // no occlusion culling by default
        kxscene->SetDbvtOcclusionRes(0);
 
+
+       /* Objects' Conversion */
+
        int activeLayerBitInfo = blenderscene->lay;
-       
+
        // list of all object converted, active and inactive
        CListValue*     sumolist = new CListValue();
-       
+
        vector<parentChildLink> vec_parent_child;
-       
+
        CListValue* objectlist = kxscene->GetObjectList();
        CListValue* inactivelist = kxscene->GetInactiveList();
        CListValue* parentlist = kxscene->GetRootParentList();
-       
+
        SCA_LogicManager* logicmgr = kxscene->GetLogicManager();
        SCA_TimeEventManager* timemgr = kxscene->GetTimeEventManager();
-       
+
        CListValue* logicbrick_conversionlist = new CListValue();
-       
-       //SG_TreeFactory tf;
-       
+
        // Convert actions to actionmap
        bAction *curAct;
        for (curAct = (bAction*)maggie->action.first; curAct; 
curAct=(bAction*)curAct->id.next)
@@ -1968,6 +1980,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
        }
 
        SetDefaultLightMode(blenderscene);
+
        // Let's support scene set.
        // Beware of name conflict in linked data, it will not crash but will 
create confusion
        // in Python scripting and in certain actuators (replace mesh). Linked 
scene *should* have
@@ -2086,14 +2099,12 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
                        }
                }
        }
-       
+
        // create hierarchy information
        int i;
        vector<parentChildLink>::iterator pcit;
-       
        for (pcit = 
vec_parent_child.begin();!(pcit==vec_parent_child.end());++pcit)
        {
-       
                struct Object* blenderchild = pcit->m_blenderchild;
                struct Object* blenderparent = blenderchild->parent;
                KX_GameObject* parentobj = 
converter->FindGameObject(blenderparent);
@@ -2193,7 +2204,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
                for (i=0; i<sumolist->GetCount();i++)
                {
                        KX_GameObject* gameobj = (KX_GameObject*) 
sumolist->GetValue(i);
-                       if (gameobj->GetMeshCount() > 0) 
+                       if (gameobj->GetMeshCount() > 0)
                        {
                                MT_Point3 box[2];
                                gameobj->GetSGNode()->BBox().getmm(box, 
MT_Transform::Identity());
@@ -2207,6 +2218,8 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
                if (occlusion)
                        
kxscene->SetDbvtOcclusionRes(blenderscene->gm.occlusionRes);
        }
+
+
        if (blenderscene->world)
                
kxscene->GetPhysicsEnvironment()->SetNumTimeSubSteps(blenderscene->gm.physubstep);
 
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp 
b/source/gameengine/Ketsji/KX_GameObject.cpp
index 5b237ac..9958064 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -123,14 +123,10 @@ KX_GameObject::KX_GameObject(
 {
        m_ignore_activity_culling = false;
        m_pClient_info = new KX_ClientObjectInfo(this, 
KX_ClientObjectInfo::ACTOR);
-       m_pSGNode = new SG_Node(this,sgReplicationInfo,callbacks);
 
-       // define the relationship between this node and it's parent.
-       
-       KX_NormalParentRelation * parent_relation = 
-               KX_NormalParentRelation::New();
-       m_pSGNode->SetParentRelation(parent_relation);
-};
+       m_pSGNode = new SG_Node(this,sgReplicationInfo,callbacks);
+       m_pSGNode->SetParentRelation(KX_NormalParentRelation::New());
+}
 
 
 
diff --git a/source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp 
b/source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp
index 0a45bd0..89cbf99 100644
--- a/source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp
+++ b/source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp
@@ -65,9 +65,13 @@ bool 
KX_NormalParentRelation::UpdateChildCoordinates(SG_Spatial *child, const SG
                const MT_Point3 & local_pos = child->GetLocalPosition();
                const MT_Matrix3x3 & local_orientation = 
child->GetLocalOrientation();
 
-               child->SetWorldScale(p_world_scale * local_scale);
-               child->SetWorldOrientation(p_world_orientation * 
local_orientation);
-               child->SetWorldPosition(p_world_pos + p_world_scale * 
local_scale * (p_world_orientation * local_orientation * local_pos));
+               const MT_Vector3 & new_w_scale = p_world_scale * local_scale;
+               const MT_Matrix3x3 & new_w_orientation = p_world_orientation * 
local_orientation;
+               const MT_Point3 & new_w_pos = p_world_pos + (new_w_scale * 
(new_w_orientation * local_pos));
+
+               child->SetWorldScale(new_w_scale);
+               child->SetWorldOrientation(new_w_orientation);
+               child->SetWorldPosition(new_w_pos);
        }
 
        parentUpdated = true;  //this variable is going to be used to update 
the children of this child

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

Reply via email to