Przeglądaj źródła

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

Lasse Öörni 14 lat temu
rodzic
commit
1039a2703d

+ 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.