[Add] Use new body death code with pre-hyperspace clearout.

This commit is contained in:
Rtch90 2017-11-19 15:01:32 +00:00
parent 6d568a0ecf
commit 6404418ce1
3 changed files with 15 additions and 17 deletions

View File

@ -28,16 +28,17 @@ void Space::Init(void) {
void Space::Clear(void) { void Space::Clear(void) {
for(std::list<Body*>::iterator i = bodies.begin(); i != bodies.end(); ++i) { for(std::list<Body*>::iterator i = bodies.begin(); i != bodies.end(); ++i) {
(*i)->SetFrame(NULL); (*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<Frame*>::iterator i = rootFrame->m_children.begin(); for(std::list<Frame*>::iterator i = rootFrame->m_children.begin();
i != rootFrame->m_children.end(); ++i) delete *i; i != rootFrame->m_children.end(); ++i) delete *i;
rootFrame->m_children.clear(); rootFrame->m_children.clear();
L3D::player->SetFrame(rootFrame); L3D::player->SetFrame(rootFrame);
bodies.push_back(L3D::player);
} }
void Space::GenBody(StarSystem* system, StarSystem::SBody* sbody, Frame* f) { 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) { for(bodiesIter_t i = bodies.begin(); i != bodies.end(); ++i) {
(*i)->TimeStepUpdate(step); (*i)->TimeStepUpdate(step);
} }
/* Prune dead bodies. */ PruneCorpses();
for(bodiesIter_t i = corpses.begin(); i != corpses.end(); i++) {
ProcessCorpse(*i);
}
corpses.clear();
} }
void Space::ProcessCorpse(Body* const b) { void Space::PruneCorpses(void) {
for(bodiesIter_t i = bodies.begin(); i != bodies.end(); ++i) { for(bodiesIter_t corpse = corpses.begin(); corpse != corpses.end(); ++corpse) {
(*i)->NotifyDeath(b); for(bodiesIter_t i = bodies.begin(); i != bodies.end(); i++)
(*i)->NotifyDeath(*corpse);
bodies.remove(*corpse);
delete *corpse;
} }
bodies.remove(b); corpses.clear();
delete b;
} }
struct body_zsort_t { struct body_zsort_t {

View File

@ -25,8 +25,7 @@ public:
private: private:
static void UpdateFramesOfReference(void); static void UpdateFramesOfReference(void);
static void CollideFrame(Frame* f); static void CollideFrame(Frame* f);
static void ProcessCorpse(Body* const b); static void PruneCorpses(void);
static Frame* rootFrame; static Frame* rootFrame;
//static std::list<Frame*> rootFrames; //static std::list<Frame*> rootFrames;
static std::list<Body*> corpses; static std::list<Body*> corpses;

View File

@ -19,7 +19,7 @@ StaticRigidBody::~StaticRigidBody(void) {
free(sbreCollMesh->pFlag); free(sbreCollMesh->pFlag);
free(sbreCollMesh); free(sbreCollMesh);
} }
GetFrame()->RemoveGeom(m_geom); SetFrame(0); /* Will remove geom from frame if necessary. */
dGeomDestroy(m_geom); dGeomDestroy(m_geom);
} }