forked from bartvdbraak/blender
BGE: [#19836] Recursive Parenting in game crashes Blender. Added parenting loop detection.
This commit is contained in:
parent
aa3428e6ab
commit
3ed81eeccf
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user