[Fix] Somewhere amongs the changes docking got borked.

This commit is contained in:
Allanis 2017-11-19 22:19:16 +00:00
parent 8ff436c193
commit 14ee542723
10 changed files with 43 additions and 13 deletions

View File

@ -25,7 +25,7 @@ public:
std::string& GetLabel(void) { return m_label; } std::string& GetLabel(void) { return m_label; }
unsigned int GetFlags(void) { return m_flags; } unsigned int GetFlags(void) { return m_flags; }
/* Return true if we should apply damage. */ /* 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; } void SetProjectedPos(const vector3d& projectedPos) { m_projectedPos = projectedPos; }
/* Only valid if IsOnScreen() is true. */ /* Only valid if IsOnScreen() is true. */
const vector3d& GetProjectedPos() const; const vector3d& GetProjectedPos() const;

View File

@ -13,6 +13,16 @@ DynamicBody::DynamicBody(void) : ModelBody() {
dBodySetMass(m_body, &m_mass); 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) { void DynamicBody::SetMassDistributionFromCollMesh(const CollMesh* m) {
vector3d min = vector3d(FLT_MAX); vector3d min = vector3d(FLT_MAX);
vector3d max = vector3d(-FLT_MAX); vector3d max = vector3d(-FLT_MAX);

View File

@ -13,9 +13,11 @@ public:
void SetVelocity(vector3d v); void SetVelocity(vector3d v);
void SetAngVelocity(vector3d v); void SetAngVelocity(vector3d v);
void SetMesh(ObjMesh* m); void SetMesh(ObjMesh* m);
virtual bool OnCollision(Body* b) { return true; } virtual bool OnCollision(Body* b, Uint32 flags) { return true; }
vector3d GetAngularMomentum(void); vector3d GetAngularMomentum(void);
void SetMassDistributionFromCollMesh(const CollMesh* m); void SetMassDistributionFromCollMesh(const CollMesh* m);
virtual void Disable(void);
virtual void Enable(void);
dBodyID m_body; dBodyID m_body;
dMass m_mass; dMass m_mass;

View File

@ -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) { void ModelBody::GeomsSetBody(dBodyID body) {
for(unsigned int i = 0; i < geoms.size(); i++) { for(unsigned int i = 0; i < geoms.size(); i++) {
dGeomSetBody(geoms[i], body); dGeomSetBody(geoms[i], body);

View File

@ -23,6 +23,9 @@ public:
void GetRotMatrix(matrix4x4d& m); void GetRotMatrix(matrix4x4d& m);
virtual void SetFrame(Frame* f); virtual void SetFrame(Frame* f);
void GeomsSetBody(dBodyID body); void GeomsSetBody(dBodyID body);
/* To remove from simulation for a period. */
virtual void Disable(void);
virtual void Enable(void);
void TriMeshUpdateLastPos(void); void TriMeshUpdateLastPos(void);
void SetGeomFromSBREModel(int sbreModel, ObjParams* params); void SetGeomFromSBREModel(int sbreModel, ObjParams* params);

View File

@ -15,7 +15,7 @@ public:
virtual void TransformToModelCoords(const Frame* camFrame); virtual void TransformToModelCoords(const Frame* camFrame);
virtual void TransformCameraTo(void) {}; virtual void TransformCameraTo(void) {};
virtual void SetFrame(Frame* f); virtual void SetFrame(Frame* f);
virtual bool OnCollision(Body* b) { return true; } virtual bool OnCollision(Body* b, Uint32 flags) { return true; }
private: private:
vector3d m_pos; vector3d m_pos;
double m_radius; double m_radius;

View File

@ -144,6 +144,7 @@ void Ship::SetDockedWith(SpaceStation* s) {
/* Launching. */ /* Launching. */
printf("Buhbai!\n"); printf("Buhbai!\n");
m_dockedWith = 0; m_dockedWith = 0;
Enable();
vector3d pos = GetPosition(); vector3d pos = GetPosition();
pos.x += 5000; pos.x += 5000;
SetPosition(pos); SetPosition(pos);

View File

@ -162,7 +162,7 @@ static bool _OnCollision(dGeomID g1, dGeomID g2, Object* o1, Object* o2,
} else pb2 = static_cast<Body*>(o2); } else pb2 = static_cast<Body*>(o2);
printf("Collision flags %x\n", flags); 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; return true;
} }

View File

@ -33,14 +33,16 @@ SpaceStation::~SpaceStation(void) {
} }
bool SpaceStation::OnCollision(Body* b) { bool SpaceStation::OnCollision(Body* b, Uint32 flags) {
return true; if(flags == 1) {
/* Hitting docking area of a station. */
if(b->GetType() == Object::SHIP) { if(b->GetType() == Object::SHIP) {
Ship* s = static_cast<Ship*>(b); Ship* s = static_cast<Ship*>(b);
if(!s->GetDockedWith()) { if(!s->GetDockedWith()) {
s->Disable();
s->SetDockedWith(this); s->SetDockedWith(this);
printf("docking!\n"); printf("Docking!\n");
}
} }
return false; return false;
} else { } else {

View File

@ -6,7 +6,7 @@ class SpaceStation : public ModelBody {
public: public:
SpaceStation(void); SpaceStation(void);
virtual ~SpaceStation(void); virtual ~SpaceStation(void);
virtual bool OnCollision(Body* b); virtual bool OnCollision(Body* b, Uint32 flags);
virtual Object::Type GetType(void) { return Object::SPACESTATION; } virtual Object::Type GetType(void) { return Object::SPACESTATION; }
virtual void Render(const Frame* camFrame); virtual void Render(const Frame* camFrame);
protected: protected: