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/GameLogic/SCA_IObject.cpp | |
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/GameLogic/SCA_IObject.cpp')
-rw-r--r-- | source/gameengine/GameLogic/SCA_IObject.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
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(); } |