Browse Source

Send also node-specific 2D collision events. Closes #1535.

Lasse Öörni 9 years ago
parent
commit
d9c0ce7f15
2 changed files with 62 additions and 2 deletions
  1. 20 2
      Source/Urho3D/Urho2D/PhysicsEvents2D.h
  2. 42 0
      Source/Urho3D/Urho2D/PhysicsWorld2D.cpp

+ 20 - 2
Source/Urho3D/Urho2D/PhysicsEvents2D.h

@@ -31,7 +31,7 @@
 namespace Urho3D
 namespace Urho3D
 {
 {
 
 
-/// Physics begin contact.
+/// Physics begin contact. Global event sent by PhysicsWorld2D.
 URHO3D_EVENT(E_PHYSICSBEGINCONTACT2D, PhysicsBeginContact2D)
 URHO3D_EVENT(E_PHYSICSBEGINCONTACT2D, PhysicsBeginContact2D)
 {
 {
     URHO3D_PARAM(P_WORLD, World);                  // PhysicsWorld2D pointer
     URHO3D_PARAM(P_WORLD, World);                  // PhysicsWorld2D pointer
@@ -42,7 +42,7 @@ URHO3D_EVENT(E_PHYSICSBEGINCONTACT2D, PhysicsBeginContact2D)
     URHO3D_PARAM(P_CONTACT, Contact);              // b2Contact pointer
     URHO3D_PARAM(P_CONTACT, Contact);              // b2Contact pointer
 }
 }
 
 
-/// Physics end contact.
+/// Physics end contact. Global event sent by PhysicsWorld2D.
 URHO3D_EVENT(E_PHYSICSENDCONTACT2D, PhysicsEndContact2D)
 URHO3D_EVENT(E_PHYSICSENDCONTACT2D, PhysicsEndContact2D)
 {
 {
     URHO3D_PARAM(P_WORLD, World);                  // PhysicsWorld2D pointer
     URHO3D_PARAM(P_WORLD, World);                  // PhysicsWorld2D pointer
@@ -53,4 +53,22 @@ URHO3D_EVENT(E_PHYSICSENDCONTACT2D, PhysicsEndContact2D)
     URHO3D_PARAM(P_CONTACT, Contact);              // b2Contact pointer
     URHO3D_PARAM(P_CONTACT, Contact);              // b2Contact pointer
 }
 }
 
 
+/// Node begin contact. Sent by scene nodes participating in a collision.
+URHO3D_EVENT(E_NODEBEGINCONTACT2D, NodeBeginContact2D)
+{
+    URHO3D_PARAM(P_BODY, Body);                    // RigidBody2D pointer
+    URHO3D_PARAM(P_OTHERNODE, OtherNode);          // Node pointer
+    URHO3D_PARAM(P_OTHERBODY, OtherBody);          // RigidBody2D pointer
+    URHO3D_PARAM(P_CONTACT, Contact);              // b2Contact pointer
+}
+
+/// Node end contact. Sent by scene nodes participating in a collision.
+URHO3D_EVENT(E_NODEENDCONTACT2D, NodeEndContact2D)
+{
+    URHO3D_PARAM(P_BODY, Body);                    // RigidBody2D pointer
+    URHO3D_PARAM(P_OTHERNODE, OtherNode);          // Node pointer
+    URHO3D_PARAM(P_OTHERBODY, OtherBody);          // RigidBody2D pointer
+    URHO3D_PARAM(P_CONTACT, Contact);              // b2Contact pointer
+}
+
 }
 }

+ 42 - 0
Source/Urho3D/Urho2D/PhysicsWorld2D.cpp

@@ -675,6 +675,7 @@ void PhysicsWorld2D::SendBeginContactEvents()
 
 
     using namespace PhysicsBeginContact2D;
     using namespace PhysicsBeginContact2D;
     VariantMap& eventData = GetEventDataMap();
     VariantMap& eventData = GetEventDataMap();
+    VariantMap nodeEventData;
     eventData[P_WORLD] = this;
     eventData[P_WORLD] = this;
 
 
     for (unsigned i = 0; i < beginContactInfos_.Size(); ++i)
     for (unsigned i = 0; i < beginContactInfos_.Size(); ++i)
@@ -687,6 +688,26 @@ void PhysicsWorld2D::SendBeginContactEvents()
         eventData[P_CONTACT] = (void*)contactInfo.contact_;
         eventData[P_CONTACT] = (void*)contactInfo.contact_;
 
 
         SendEvent(E_PHYSICSBEGINCONTACT2D, eventData);
         SendEvent(E_PHYSICSBEGINCONTACT2D, eventData);
+
+        nodeEventData[NodeBeginContact2D::P_CONTACT] = (void*)contactInfo.contact_;
+
+        if (contactInfo.nodeA_)
+        {
+            nodeEventData[NodeBeginContact2D::P_BODY] = contactInfo.bodyA_.Get();
+            nodeEventData[NodeBeginContact2D::P_OTHERNODE] = contactInfo.nodeB_.Get();
+            nodeEventData[NodeBeginContact2D::P_OTHERBODY] = contactInfo.bodyB_.Get();
+
+            contactInfo.nodeA_->SendEvent(E_NODEBEGINCONTACT2D, nodeEventData);
+        }
+
+        if (contactInfo.nodeB_)
+        {
+            nodeEventData[NodeBeginContact2D::P_BODY] = contactInfo.bodyB_.Get();
+            nodeEventData[NodeBeginContact2D::P_OTHERNODE] = contactInfo.nodeA_.Get();
+            nodeEventData[NodeBeginContact2D::P_OTHERBODY] = contactInfo.bodyA_.Get();
+
+            contactInfo.nodeB_->SendEvent(E_NODEBEGINCONTACT2D, nodeEventData);
+        }
     }
     }
 
 
     beginContactInfos_.Clear();
     beginContactInfos_.Clear();
@@ -699,6 +720,7 @@ void PhysicsWorld2D::SendEndContactEvents()
 
 
     using namespace PhysicsEndContact2D;
     using namespace PhysicsEndContact2D;
     VariantMap& eventData = GetEventDataMap();
     VariantMap& eventData = GetEventDataMap();
+    VariantMap nodeEventData;
     eventData[P_WORLD] = this;
     eventData[P_WORLD] = this;
 
 
     for (unsigned i = 0; i < endContactInfos_.Size(); ++i)
     for (unsigned i = 0; i < endContactInfos_.Size(); ++i)
@@ -711,6 +733,26 @@ void PhysicsWorld2D::SendEndContactEvents()
         eventData[P_CONTACT] = (void*)contactInfo.contact_;
         eventData[P_CONTACT] = (void*)contactInfo.contact_;
 
 
         SendEvent(E_PHYSICSENDCONTACT2D, eventData);
         SendEvent(E_PHYSICSENDCONTACT2D, eventData);
+
+        nodeEventData[NodeEndContact2D::P_CONTACT] = (void*)contactInfo.contact_;
+
+        if (contactInfo.nodeA_)
+        {
+            nodeEventData[NodeEndContact2D::P_BODY] = contactInfo.bodyA_.Get();
+            nodeEventData[NodeEndContact2D::P_OTHERNODE] = contactInfo.nodeB_.Get();
+            nodeEventData[NodeEndContact2D::P_OTHERBODY] = contactInfo.bodyB_.Get();
+
+            contactInfo.nodeA_->SendEvent(E_NODEENDCONTACT2D, nodeEventData);
+        }
+
+        if (contactInfo.nodeB_)
+        {
+            nodeEventData[NodeEndContact2D::P_BODY] = contactInfo.bodyB_.Get();
+            nodeEventData[NodeEndContact2D::P_OTHERNODE] = contactInfo.nodeA_.Get();
+            nodeEventData[NodeEndContact2D::P_OTHERBODY] = contactInfo.bodyA_.Get();
+
+            contactInfo.nodeB_->SendEvent(E_NODEENDCONTACT2D, nodeEventData);
+        }
     }
     }
 
 
     endContactInfos_.Clear();
     endContactInfos_.Clear();