BGE: [#19836] Recursive Parenting in game crashes Blender. Added parenting loop detection.

This commit is contained in:
Benoit Bolsee 2010-03-25 21:43:36 +00:00
parent aa3428e6ab
commit 3ed81eeccf
3 changed files with 18 additions and 1 deletions

@ -234,7 +234,11 @@ KX_GameObject* KX_GameObject::GetParent()
void KX_GameObject::SetParent(KX_Scene *scene, KX_GameObject* obj, bool addToCompound, bool ghost) 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 // 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 // Make sure the objects have some scale
MT_Vector3 scale1 = NodeGetWorldScaling(); MT_Vector3 scale1 = NodeGetWorldScaling();

@ -150,6 +150,12 @@ GetRootSGParent(
return (m_SGparent ? (const SG_Node*) m_SGparent->GetRootSGParent() : (const SG_Node*) this); 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 void
SG_Node:: SG_Node::
DisconnectFromParent( DisconnectFromParent(

@ -77,6 +77,13 @@ public:
SG_Node* child 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 * Get the current list of children. Do not use this interface for
* adding or removing children please use the methods of this class for * adding or removing children please use the methods of this class for