From 421abb2324d288701e0ed8248938ab9151bfc14d Mon Sep 17 00:00:00 2001
From: Rtch90 <ritchie.cunningham@protonmail.com>
Date: Sun, 19 Nov 2017 22:19:16 +0000
Subject: [PATCH] [Fix] Somewhere amongs the changes docking got borked.

---
 src/body.h            |  2 +-
 src/dynamic_body.cpp  | 10 ++++++++++
 src/dynamic_body.h    |  4 +++-
 src/model_body.cpp    | 12 ++++++++++++
 src/model_body.h      |  3 +++
 src/planet.h          |  2 +-
 src/ship.cpp          |  1 +
 src/space.cpp         |  2 +-
 src/space_station.cpp | 18 ++++++++++--------
 src/space_station.h   |  2 +-
 10 files changed, 43 insertions(+), 13 deletions(-)

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<Body*>(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<Ship*>(b);
-    if(!s->GetDockedWith()) {
-      s->SetDockedWith(this);
-      printf("docking!\n");
+bool SpaceStation::OnCollision(Body* b, Uint32 flags) {
+  if(flags == 1) {
+    /* Hitting docking area of a station. */
+    if(b->GetType() == Object::SHIP) {
+      Ship* s = static_cast<Ship*>(b);
+      if(!s->GetDockedWith()) {
+        s->Disable();
+        s->SetDockedWith(this);
+        printf("Docking!\n");
+      }
     }
     return false;
   } else {
diff --git a/src/space_station.h b/src/space_station.h
index c696a9d..848dc7c 100644
--- a/src/space_station.h
+++ b/src/space_station.h
@@ -6,7 +6,7 @@ class SpaceStation : public ModelBody {
 public:
   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 void Render(const Frame* camFrame);
 protected: