#include "munga.h" #pragma hdrstop #include "collorgn.h" #include "mover.h" #include "doorfram.h" // //############################################################################# // CollisionOrigin //############################################################################# // CollisionOrigin::CollisionOrigin(InterestZoneID interest_zone_ID): InterestOrigin( interest_zone_ID, CollisionInterestType, DefaultInterestDepth ), movingEntitySocket(NULL) { } // //############################################################################# // ~CollisionOrigin //############################################################################# // CollisionOrigin::~CollisionOrigin() { } // //############################################################################# // TestInstance //############################################################################# // Logical CollisionOrigin::TestInstance() const { InterestOrigin::TestInstance(); Check(&movingEntitySocket); return True; } // //############################################################################# // AddInterestingEntity //############################################################################# // void CollisionOrigin::AddInterestingEntity(Entity *interesting_entity) { Check(this); Check(interesting_entity); // //-------------------------------------------------------------------------- // Make sure that we don't check against something that doesn't move //-------------------------------------------------------------------------- // if (interesting_entity->IsDynamic()) { // //----------------------------------------------------------------------- // If it is a mover and tangible, or a door, add it to our list //----------------------------------------------------------------------- // if (interesting_entity->IsDerivedFrom(*Mover::GetClassDerivations())) { Mover *mover = Cast_Object(Mover*, interesting_entity); if (mover->IsCollisionTestable()) { movingEntitySocket.Add(interesting_entity); } } else if (interesting_entity->IsDerivedFrom(*DoorFrame::GetClassDerivations())) { movingEntitySocket.Add(interesting_entity); } } } // //############################################################################# // RemoveUninterestingEntity //############################################################################# // void CollisionOrigin::RemoveUninterestingEntity(Entity *uninteresting_entity) { Check(this); Check(uninteresting_entity); // // HACK - ECH The following may not be a legitimate assertion // #if DEBUG_LEVEL>0 && 0 { SChainIteratorOf iterator(&movingEntitySocket); Verify(iterator.IsPlugMember(uninteresting_entity) == True); } #endif // // Remove from socket // PlugIterator iterator(uninteresting_entity); Check(&iterator); iterator.RemoveSocket(&movingEntitySocket); } // //############################################################################# // RemoveUninterestingEntities //############################################################################# // void CollisionOrigin::RemoveUninterestingEntities() { Check(this); SChainIteratorOf iterator(&movingEntitySocket); Check(&iterator); while (iterator.GetCurrent() != NULL) { Check(iterator.GetCurrent()); iterator.Remove(); } } //~~~~~~~~~~~~~~~~~~~ CollisionOrigin__MovingEntityIterator ~~~~~~~~~~~~~~~~~~~ CollisionOrigin__MovingEntityIterator::CollisionOrigin__MovingEntityIterator( CollisionOrigin *collision_origin ): SChainIteratorOf(collision_origin->movingEntitySocket) { } CollisionOrigin__MovingEntityIterator::~CollisionOrigin__MovingEntityIterator() { }