فهرست منبع

Register physics joints in similar manner as rigid bodies and collision shapes. Clean up PhysicsWorld destructor.

Lasse Öörni 14 سال پیش
والد
کامیت
1039a2703d
3فایلهای تغییر یافته به همراه33 افزوده شده و 21 حذف شده
  1. 7 0
      Engine/Physics/Joint.cpp
  2. 17 19
      Engine/Physics/PhysicsWorld.cpp
  3. 9 2
      Engine/Physics/PhysicsWorld.h

+ 7 - 0
Engine/Physics/Joint.cpp

@@ -56,6 +56,9 @@ Joint::Joint(Context* context) :
 Joint::~Joint()
 {
     Clear();
+    
+    if (physicsWorld_)
+        physicsWorld_->RemoveJoint(this);
 }
 
 void Joint::RegisterObject(Context* context)
@@ -287,6 +290,10 @@ void Joint::OnNodeSet(Node* node)
     {
         Scene* scene = node->GetScene();
         if (scene)
+        {
             physicsWorld_ = scene->GetComponent<PhysicsWorld>();
+            if (physicsWorld_)
+                physicsWorld_->AddJoint(this);
+        }
     }
 }

+ 17 - 19
Engine/Physics/PhysicsWorld.cpp

@@ -133,29 +133,15 @@ PhysicsWorld::~PhysicsWorld()
 {
     if (scene_)
     {
-        // Force all remaining joints, rigidbodies and collisionshapes to release themselves
-        PODVector<Node*> nodes;
-        PODVector<Joint*> joints;
-        PODVector<CollisionShape*> collisionShapes;
-        
-        scene_->GetChildrenWithComponent(nodes, Joint::GetTypeStatic(), true);
-        for (PODVector<Node*>::Iterator i = nodes.Begin(); i != nodes.End(); ++i)
-        {
-            (*i)->GetComponents<Joint>(joints);
-            for (PODVector<Joint*>::Iterator j = joints.Begin(); j != joints.End(); ++j)
-                (*j)->Clear();
-        }
+        // Force all remaining joints, rigid bodies and collision shapes to release themselves
+        for (PODVector<Joint*>::Iterator i = joints_.Begin(); i != joints_.End(); ++i)
+            (*i)->Clear();
         
         for (PODVector<RigidBody*>::Iterator i = rigidBodies_.Begin(); i != rigidBodies_.End(); ++i)
             (*i)->ReleaseBody();
         
-        scene_->GetChildrenWithComponent(nodes, CollisionShape::GetTypeStatic(), true);
-        for (PODVector<Node*>::Iterator i = nodes.Begin(); i != nodes.End(); ++i)
-        {
-            (*i)->GetComponents<CollisionShape>(collisionShapes);
-            for (PODVector<CollisionShape*>::Iterator j = collisionShapes.Begin(); j != collisionShapes.End(); ++j)
-                (*j)->Clear();
-        }
+        for (PODVector<CollisionShape*>::Iterator i = collisionShapes_.Begin(); i != collisionShapes_.End(); ++i)
+            (*i)->Clear();
     }
     
     // Remove any cached geometries that still remain
@@ -449,6 +435,18 @@ void PhysicsWorld::RemoveCollisionShape(CollisionShape* shape)
         collisionShapes_.Erase(i);
 }
 
+void PhysicsWorld::AddJoint(Joint* joint)
+{
+    joints_.Push(joint);
+}
+
+void PhysicsWorld::RemoveJoint(Joint* joint)
+{
+    PODVector<Joint*>::Iterator i = joints_.Find(joint);
+    if (i != joints_.End())
+        joints_.Erase(i);
+}
+
 void PhysicsWorld::SendCollisionEvents()
 {
     PROFILE(SendCollisionEvents);

+ 9 - 2
Engine/Physics/PhysicsWorld.h

@@ -31,6 +31,7 @@
 class CollisionShape;
 class DebugRenderer;
 class Deserializer;
+class Joint;
 class Node;
 class Ray;
 class RigidBody;
@@ -178,6 +179,10 @@ public:
     void AddCollisionShape(CollisionShape* shape);
     /// Remove a collision shape. Called by CollisionShape.
     void RemoveCollisionShape(CollisionShape* shape);
+    /// Add a joint to keep track of. Called by Joint.
+    void AddJoint(Joint* joint);
+    /// Remove a joint. Called by Joint.
+    void RemoveJoint(Joint* joint);
     /// Send accumulated collision events.
     void SendCollisionEvents();
     /// Add debug geometry to the debug graphics.
@@ -224,10 +229,12 @@ private:
     float timeAcc_;
     /// Simulation random seed.
     unsigned randomSeed_;
-    /// Rigid bodies.
+    /// Rigid bodies in the world.
     PODVector<RigidBody*> rigidBodies_;
-    /// Collision shapes.
+    /// Collision shapes in the world.
     PODVector<CollisionShape*> collisionShapes_;
+    /// Joints in the world.
+    PODVector<Joint*> joints_;
     /// Collision contacts (PODVector<dContact>.)
     void* contacts_;
     /// Collision pairs on this frame.