[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27754] trunk/blender/source/gameengine: BGE: [#19836] Recursive Parenting in game crashes Blender.
Benoit Bolsee
benoit.bolsee at online.be
Thu Mar 25 22:43:36 CET 2010
Revision: 27754
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27754
Author: ben2610
Date: 2010-03-25 22:43:36 +0100 (Thu, 25 Mar 2010)
Log Message:
-----------
BGE: [#19836] Recursive Parenting in game crashes Blender. Added parenting loop detection.
Modified Paths:
--------------
trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
trunk/blender/source/gameengine/SceneGraph/SG_Node.cpp
trunk/blender/source/gameengine/SceneGraph/SG_Node.h
Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp 2010-03-25 21:40:08 UTC (rev 27753)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp 2010-03-25 21:43:36 UTC (rev 27754)
@@ -234,7 +234,11 @@
void KX_GameObject::SetParent(KX_Scene *scene, KX_GameObject* obj, bool addToCompound, bool ghost)
{
// check on valid node in case a python controller holds a reference to a deleted object
- if (obj && GetSGNode() && obj->GetSGNode() && GetSGNode()->GetSGParent() != obj->GetSGNode())
+ if (obj &&
+ GetSGNode() && // object is not zombi
+ obj->GetSGNode() && // object is not zombi
+ GetSGNode()->GetSGParent() != obj->GetSGNode() && // not already parented to same object
+ !GetSGNode()->IsAncessor(obj->GetSGNode())) // no parenting loop
{
// Make sure the objects have some scale
MT_Vector3 scale1 = NodeGetWorldScaling();
Modified: trunk/blender/source/gameengine/SceneGraph/SG_Node.cpp
===================================================================
--- trunk/blender/source/gameengine/SceneGraph/SG_Node.cpp 2010-03-25 21:40:08 UTC (rev 27753)
+++ trunk/blender/source/gameengine/SceneGraph/SG_Node.cpp 2010-03-25 21:43:36 UTC (rev 27754)
@@ -150,6 +150,12 @@
return (m_SGparent ? (const SG_Node*) m_SGparent->GetRootSGParent() : (const SG_Node*) this);
}
+bool SG_Node::IsAncessor(const SG_Node* child) const
+{
+ return (!child->m_SGparent) ? false :
+ (child->m_SGparent == this) ? true : IsAncessor(child->m_SGparent);
+}
+
void
SG_Node::
DisconnectFromParent(
Modified: trunk/blender/source/gameengine/SceneGraph/SG_Node.h
===================================================================
--- trunk/blender/source/gameengine/SceneGraph/SG_Node.h 2010-03-25 21:40:08 UTC (rev 27753)
+++ trunk/blender/source/gameengine/SceneGraph/SG_Node.h 2010-03-25 21:43:36 UTC (rev 27754)
@@ -77,6 +77,13 @@
SG_Node* child
);
+ /**
+ * Return true if the node is the ancessor of child
+ */
+ bool
+ IsAncessor(
+ const SG_Node* child
+ ) const;
/**
* Get the current list of children. Do not use this interface for
* adding or removing children please use the methods of this class for
More information about the Bf-blender-cvs
mailing list