diff --git a/src/space.cpp b/src/space.cpp index 72a0ffe..44c1720 100644 --- a/src/space.cpp +++ b/src/space.cpp @@ -28,16 +28,17 @@ void Space::Init(void) { void Space::Clear(void) { for(std::list::iterator i = bodies.begin(); i != bodies.end(); ++i) { (*i)->SetFrame(NULL); - if((*i) != (Body*)L3D::player) delete *i; + if((*i) != (Body*)L3D::player) { + KillBody(*i); + } } - bodies.clear(); - /* Player now removed also, but not freed. */ + PruneCorpses(); + for(std::list::iterator i = rootFrame->m_children.begin(); i != rootFrame->m_children.end(); ++i) delete *i; rootFrame->m_children.clear(); L3D::player->SetFrame(rootFrame); - bodies.push_back(L3D::player); } void Space::GenBody(StarSystem* system, StarSystem::SBody* sbody, Frame* f) { @@ -218,19 +219,17 @@ void Space::TimeStep(float step) { for(bodiesIter_t i = bodies.begin(); i != bodies.end(); ++i) { (*i)->TimeStepUpdate(step); } - /* Prune dead bodies. */ - for(bodiesIter_t i = corpses.begin(); i != corpses.end(); i++) { - ProcessCorpse(*i); - } - corpses.clear(); + PruneCorpses(); } -void Space::ProcessCorpse(Body* const b) { - for(bodiesIter_t i = bodies.begin(); i != bodies.end(); ++i) { - (*i)->NotifyDeath(b); +void Space::PruneCorpses(void) { + for(bodiesIter_t corpse = corpses.begin(); corpse != corpses.end(); ++corpse) { + for(bodiesIter_t i = bodies.begin(); i != bodies.end(); i++) + (*i)->NotifyDeath(*corpse); + bodies.remove(*corpse); + delete *corpse; } - bodies.remove(b); - delete b; + corpses.clear(); } struct body_zsort_t { diff --git a/src/space.h b/src/space.h index 7de8dde..ebf33f3 100644 --- a/src/space.h +++ b/src/space.h @@ -25,8 +25,7 @@ public: private: static void UpdateFramesOfReference(void); static void CollideFrame(Frame* f); - static void ProcessCorpse(Body* const b); - + static void PruneCorpses(void); static Frame* rootFrame; //static std::list rootFrames; static std::list corpses; diff --git a/src/static_rigid_body.cpp b/src/static_rigid_body.cpp index d15010e..0992506 100644 --- a/src/static_rigid_body.cpp +++ b/src/static_rigid_body.cpp @@ -19,7 +19,7 @@ StaticRigidBody::~StaticRigidBody(void) { free(sbreCollMesh->pFlag); free(sbreCollMesh); } - GetFrame()->RemoveGeom(m_geom); + SetFrame(0); /* Will remove geom from frame if necessary. */ dGeomDestroy(m_geom); }