[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) {
for(std::list<Body*>::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<Frame*>::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 {

View File

@ -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<Frame*> rootFrames;
static std::list<Body*> corpses;

View File

@ -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);
}