diff --git a/src/body.h b/src/body.h index aaefcaf..64dae8f 100644 --- a/src/body.h +++ b/src/body.h @@ -25,7 +25,7 @@ public: std::string& GetLabel(void) { return m_label; } unsigned int GetFlags(void) { return m_flags; } /* Return true if we should apply damage. */ - virtual bool OnCollision(Body* b) { return false; } + virtual bool OnCollision(Body* b, Uint32 flags) { return false; } void SetProjectedPos(const vector3d& projectedPos) { m_projectedPos = projectedPos; } /* Only valid if IsOnScreen() is true. */ const vector3d& GetProjectedPos() const; diff --git a/src/dynamic_body.cpp b/src/dynamic_body.cpp index 02f28ae..b35456d 100644 --- a/src/dynamic_body.cpp +++ b/src/dynamic_body.cpp @@ -13,6 +13,16 @@ DynamicBody::DynamicBody(void) : ModelBody() { dBodySetMass(m_body, &m_mass); } +void DynamicBody::Enable(void) { + ModelBody::Enable(); + dBodyEnable(m_body); +} + +void DynamicBody::Disable(void) { + ModelBody::Disable(); + dBodyDisable(m_body); +} + void DynamicBody::SetMassDistributionFromCollMesh(const CollMesh* m) { vector3d min = vector3d(FLT_MAX); vector3d max = vector3d(-FLT_MAX); diff --git a/src/dynamic_body.h b/src/dynamic_body.h index 8891242..aebe3b9 100644 --- a/src/dynamic_body.h +++ b/src/dynamic_body.h @@ -13,9 +13,11 @@ public: void SetVelocity(vector3d v); void SetAngVelocity(vector3d v); void SetMesh(ObjMesh* m); - virtual bool OnCollision(Body* b) { return true; } + virtual bool OnCollision(Body* b, Uint32 flags) { return true; } vector3d GetAngularMomentum(void); void SetMassDistributionFromCollMesh(const CollMesh* m); + virtual void Disable(void); + virtual void Enable(void); dBodyID m_body; dMass m_mass; diff --git a/src/model_body.cpp b/src/model_body.cpp index e1873fc..1105f49 100644 --- a/src/model_body.cpp +++ b/src/model_body.cpp @@ -18,6 +18,18 @@ ModelBody::~ModelBody(void) { } } +void ModelBody::Disable(void) { + for(unsigned int i = 0; i < geoms.size(); i++) { + dGeomDisable(geoms[i]); + } +} + +void ModelBody::Enable(void) { + for(unsigned int i = 0; i < geoms.size(); i++) { + dGeomEnable(geoms[i]); + } +} + void ModelBody::GeomsSetBody(dBodyID body) { for(unsigned int i = 0; i < geoms.size(); i++) { dGeomSetBody(geoms[i], body); diff --git a/src/model_body.h b/src/model_body.h index 6e791d3..7b0dd8e 100644 --- a/src/model_body.h +++ b/src/model_body.h @@ -23,6 +23,9 @@ public: void GetRotMatrix(matrix4x4d& m); virtual void SetFrame(Frame* f); void GeomsSetBody(dBodyID body); + /* To remove from simulation for a period. */ + virtual void Disable(void); + virtual void Enable(void); void TriMeshUpdateLastPos(void); void SetGeomFromSBREModel(int sbreModel, ObjParams* params); diff --git a/src/planet.h b/src/planet.h index 50588f9..1042927 100644 --- a/src/planet.h +++ b/src/planet.h @@ -15,7 +15,7 @@ public: virtual void TransformToModelCoords(const Frame* camFrame); virtual void TransformCameraTo(void) {}; virtual void SetFrame(Frame* f); - virtual bool OnCollision(Body* b) { return true; } + virtual bool OnCollision(Body* b, Uint32 flags) { return true; } private: vector3d m_pos; double m_radius; diff --git a/src/ship.cpp b/src/ship.cpp index 4729a93..6086806 100644 --- a/src/ship.cpp +++ b/src/ship.cpp @@ -144,6 +144,7 @@ void Ship::SetDockedWith(SpaceStation* s) { /* Launching. */ printf("Buhbai!\n"); m_dockedWith = 0; + Enable(); vector3d pos = GetPosition(); pos.x += 5000; SetPosition(pos); diff --git a/src/space.cpp b/src/space.cpp index bfcf594..7abdc25 100644 --- a/src/space.cpp +++ b/src/space.cpp @@ -162,7 +162,7 @@ static bool _OnCollision(dGeomID g1, dGeomID g2, Object* o1, Object* o2, } else pb2 = static_cast
(o2); printf("Collision flags %x\n", flags); - if((pb1 && !pb1->OnCollision(pb2)) || (pb2 && !pb2->OnCollision(pb1))) return false; + if((pb1 && !pb1->OnCollision(pb2, flags)) || (pb2 && !pb2->OnCollision(pb1, flags))) return false; } return true; } diff --git a/src/space_station.cpp b/src/space_station.cpp index e5f9ec8..fb1c186 100644 --- a/src/space_station.cpp +++ b/src/space_station.cpp @@ -33,14 +33,16 @@ SpaceStation::~SpaceStation(void) { } -bool SpaceStation::OnCollision(Body* b) { - return true; - - if(b->GetType() == Object::SHIP) { - Ship* s = static_cast