diff options
author | Benoit Bolsee <benoit.bolsee@online.be> | 2008-04-27 00:41:25 +0400 |
---|---|---|
committer | Benoit Bolsee <benoit.bolsee@online.be> | 2008-04-27 00:41:25 +0400 |
commit | bc059cb8b2b8b09553e4d02b4bcccd67ff73d8fd (patch) | |
tree | ee9bc078e5878197018e08ec609fc527bab3f6eb /source/gameengine/Ketsji | |
parent | c8376869b1a521c903a6f8d1be49e48c2966df70 (diff) |
BGE bug: crash when an object being tracked-to is deleted (bad practice anyway). Fix by creating a generic cross reference between actuators (only TrackTo uses it at the moment) and objects so that the actuator is informed when the target object is deleted
Diffstat (limited to 'source/gameengine/Ketsji')
-rw-r--r-- | source/gameengine/Ketsji/KX_TrackToActuator.cpp | 34 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_TrackToActuator.h | 2 |
2 files changed, 32 insertions, 4 deletions
diff --git a/source/gameengine/Ketsji/KX_TrackToActuator.cpp b/source/gameengine/Ketsji/KX_TrackToActuator.cpp index dc637bf0837..58b87367258 100644 --- a/source/gameengine/Ketsji/KX_TrackToActuator.cpp +++ b/source/gameengine/Ketsji/KX_TrackToActuator.cpp @@ -70,6 +70,7 @@ KX_TrackToActuator::KX_TrackToActuator(SCA_IObject *gameobj, m_parentobj = 0; if (m_object){ + m_object->RegisterActuator(this); KX_GameObject* curobj = (KX_GameObject*) GetParent(); m_parentobj = curobj->GetParent(); // check if the object is parented @@ -176,12 +177,31 @@ MT_Matrix3x3 matrix3x3_interpol(MT_Matrix3x3 oldmat, MT_Matrix3x3 mat, int m_tim KX_TrackToActuator::~KX_TrackToActuator() -{ - // there's nothing to be done here, really.... +{ + if (m_object) + m_object->UnregisterActuator(this); } /* end of destructor */ +void KX_TrackToActuator::ProcessReplica() +{ + // the replica is tracking the same object => register it + if (m_object) + m_object->RegisterActuator(this); + SCA_IActuator::ProcessReplica(); +} +bool KX_TrackToActuator::UnlinkObject(SCA_IObject* clientobj) +{ + if (clientobj == m_object) + { + // this object is being deleted, we cannot continue to track it. + m_object = NULL; + return true; + } + return false; +} + bool KX_TrackToActuator::Update(double curtime, bool frame) { bool result = false; @@ -430,8 +450,11 @@ PyObject* KX_TrackToActuator::PySetObject(PyObject* self, PyObject* args, PyObje PyObject* gameobj; if (PyArg_ParseTuple(args, "O!", &KX_GameObject::Type, &gameobj)) { + if (m_object != NULL) + m_object->UnregisterActuator(this); m_object = (SCA_IObject*)gameobj; - + if (m_object) + m_object->RegisterActuator(this); Py_Return; } PyErr_Clear(); @@ -439,8 +462,11 @@ PyObject* KX_TrackToActuator::PySetObject(PyObject* self, PyObject* args, PyObje char* objectname; if (PyArg_ParseTuple(args, "s", &objectname)) { + if (m_object != NULL) + m_object->UnregisterActuator(this); m_object= static_cast<SCA_IObject*>(SCA_ILogicBrick::m_sCurrentLogicManager->GetGameObjectByName(STR_String(objectname))); - + if (m_object) + m_object->RegisterActuator(this); Py_Return; } diff --git a/source/gameengine/Ketsji/KX_TrackToActuator.h b/source/gameengine/Ketsji/KX_TrackToActuator.h index 944eaadf025..a03aa115baa 100644 --- a/source/gameengine/Ketsji/KX_TrackToActuator.h +++ b/source/gameengine/Ketsji/KX_TrackToActuator.h @@ -66,6 +66,8 @@ class KX_TrackToActuator : public SCA_IActuator return replica; }; + virtual void ProcessReplica(); + virtual bool UnlinkObject(SCA_IObject* clientobj); virtual bool Update(double curtime, bool frame); /* Python part */ |