From bc059cb8b2b8b09553e4d02b4bcccd67ff73d8fd Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Sat, 26 Apr 2008 20:41:25 +0000 Subject: 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 --- source/gameengine/GameLogic/SCA_IObject.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'source/gameengine/GameLogic/SCA_IObject.cpp') diff --git a/source/gameengine/GameLogic/SCA_IObject.cpp b/source/gameengine/GameLogic/SCA_IObject.cpp index 465dd981406..6df9e23f3fa 100644 --- a/source/gameengine/GameLogic/SCA_IObject.cpp +++ b/source/gameengine/GameLogic/SCA_IObject.cpp @@ -62,6 +62,10 @@ SCA_IObject::~SCA_IObject() ((CValue*)(*itc))->Release(); } SCA_ActuatorList::iterator ita; + for (ita = m_registeredActuators.begin(); !(ita==m_registeredActuators.end()); ++ita) + { + (*ita)->UnlinkObject(this); + } for (ita = m_actuators.begin(); !(ita==m_actuators.end()); ++ita) { ((CValue*)(*ita))->Release(); @@ -118,7 +122,24 @@ void SCA_IObject::AddActuator(SCA_IActuator* act) m_actuators.push_back(act); } +void SCA_IObject::RegisterActuator(SCA_IActuator* act) +{ + // don't increase ref count, it would create dead lock + m_registeredActuators.push_back(act); +} +void SCA_IObject::UnregisterActuator(SCA_IActuator* act) +{ + SCA_ActuatorList::iterator ita; + for (ita = m_registeredActuators.begin(); ita != m_registeredActuators.end(); ita++) + { + if ((*ita) == act) { + (*ita) = m_registeredActuators.back(); + m_registeredActuators.pop_back(); + break; + } + } +} void SCA_IObject::SetIgnoreActivityCulling(bool b) { @@ -168,6 +189,8 @@ void SCA_IObject::ReParentLogic() newactuator->SetActive(false); oldactuators[act++] = newactuator; } + // a new object cannot be client of any actuator + m_registeredActuators.clear(); } -- cgit v1.2.3