Explorar el Código

Improve PhysicsCallback

Daniele Bartolini hace 12 años
padre
commit
b2f146c437
Se han modificado 2 ficheros con 48 adiciones y 36 borrados
  1. 43 35
      engine/physics/PhysicsCallback.h
  2. 5 1
      engine/physics/PhysicsTypes.h

+ 43 - 35
engine/physics/PhysicsCallback.h

@@ -55,6 +55,8 @@ using physx::PxVec3;
 using physx::PxRaycastCallback;
 using physx::PxAgain;
 using physx::PxRaycastHit;
+using physx::PxPairFlag;
+using physx::PxContactPairFlag;
 
 namespace crown
 {
@@ -81,51 +83,62 @@ public:
 	//-----------------------------------------------------------------------------
 	void onContact(const PxContactPairHeader& pair_header, const PxContactPair* pairs, PxU32 num_pairs)
 	{
-		// printf("CONTACT\n");
+		// Do not report contact if either actor0 or actor1 or both have been deleted
+		if (pair_header.flags & PxContactPairHeaderFlag::eDELETED_ACTOR_0 ||
+			pair_header.flags & PxContactPairHeaderFlag::eDELETED_ACTOR_1) return;
 
-		// Do not report contact if either actor0 or actor1 has been deleted
-		if (pair_header.flags & PxContactPairHeaderFlag::eDELETED_ACTOR_0 || pair_header.flags & PxContactPairHeaderFlag::eDELETED_ACTOR_1) return;
-
-		// printf("ACTOR0 = %.4X\n", pair_header.actors[0]->userData);
-		// printf("ACTOR1 = %.4X\n", pair_header.actors[1]->userData);
-
-		PxVec3 where;
-
-		// printf("Num pairs = %d\n", num_pairs);
 		for (PxU32 pp = 0; pp < num_pairs; pp++)
 		{
-			PxContactPairPoint points[8];
-			const PxU32 num_points = pairs[pp].extractContacts(points, 8);
-			// printf("Num points = %d\n", num_points);
+			const PxContactPair& cp = pairs[pp];
+
+			// We are only interested in touch found or lost
+			if (!cp.events & PxPairFlag::eNOTIFY_TOUCH_FOUND ||
+				!cp.events & PxPairFlag::eNOTIFY_TOUCH_LOST) continue;
 
+			// Skip if either shape0 or shape1 or both have been deleted
+			if (cp.flags & PxContactPairFlag::eDELETED_SHAPE_0 ||
+				cp.flags & PxContactPairFlag::eDELETED_SHAPE_1) continue;
+			
+			PxContactPairPoint points[8];
+			const PxU32 num_points = cp.extractContacts(points, 8);
+			
+			PxVec3 where;
+			PxVec3 normal;
 			for (PxU32 i = 0; i < num_points; i++)
 			{
 				where = points[i].position;
-				// printf("where = %.2f %.2f %.2f\n", where.x, where.y, where.z);
+				normal = points[i].normal;
 			}
-		}
 
-		physics_world::CollisionEvent ev;
-		ev.actors[0] = (Actor*) pair_header.actors[0]->userData;
-		ev.actors[1] = (Actor*) pair_header.actors[1]->userData;
-		ev.where = Vector3(where.x, where.y, where.z);
-		event_stream::write(m_events, physics_world::EventType::COLLISION, ev);
+			physics_world::CollisionEvent ev;
+			ev.type = (cp.events & PxPairFlag::eNOTIFY_TOUCH_FOUND) ?
+						physics_world::CollisionEvent::BEGIN_TOUCH :
+						physics_world::CollisionEvent::END_TOUCH;
+			ev.actors[0] = (Actor*) pair_header.actors[0]->userData;
+			ev.actors[1] = (Actor*) pair_header.actors[1]->userData;
+			ev.where = Vector3(where.x, where.y, where.z);
+			ev.normal = Vector3(normal.x, normal.y, normal.z);
+			event_stream::write(m_events, physics_world::EventType::COLLISION, ev);
+		}
 	}
 
 	//-----------------------------------------------------------------------------
 	void onTrigger(PxTriggerPair* pairs, PxU32 count)
 	{
-		// printf("TRIGGER\n");
-		// printf("Num pairs = %d\n", count);
-
 		for (PxU32 pp = 0; pp < count; pp++)
 		{
-			const PxTriggerPair& pair = pairs[pp];
-			// Do not report event if either trigger ot other shape has been deleted
-			if (pair.flags & PxTriggerPairFlag::eDELETED_SHAPE_TRIGGER || pair.flags & PxTriggerPairFlag::eDELETED_SHAPE_OTHER) continue;
+			const PxTriggerPair& tp = pairs[pp];
+
+			// Do not report event if either trigger ot other shape or both have been deleted
+			if (tp.flags & PxTriggerPairFlag::eDELETED_SHAPE_TRIGGER ||
+				tp.flags & PxTriggerPairFlag::eDELETED_SHAPE_OTHER) continue;
 
-			// TODO
 			physics_world::TriggerEvent ev;
+			ev.type = (tp.status & PxPairFlag::eNOTIFY_TOUCH_FOUND ?
+						physics_world::TriggerEvent::BEGIN_TOUCH : physics_world::TriggerEvent::END_TOUCH);
+			ev.trigger = (Actor*) tp.triggerActor->userData;
+			ev.other = (Actor*) tp.otherActor->userData;
+
 			event_stream::write(m_events, physics_world::EventType::TRIGGER, ev);
 		}
 	}
@@ -133,13 +146,11 @@ public:
 	//-----------------------------------------------------------------------------
 	void onWake(PxActor** /*actors*/, PxU32 /*count*/)
 	{
-		// printf("WAKE\n");
 	}
 
 	//-----------------------------------------------------------------------------
 	void onSleep(PxActor** /*actors*/, PxU32 /*count*/)
 	{
-		// printf("SLEEP\n");
 	}
 
 private:
@@ -151,21 +162,18 @@ private:
 class PhysicsControllerCallback : public PxUserControllerHitReport
 {
 	//-----------------------------------------------------------------------------
-	void onShapeHit(const PxControllerShapeHit& hit)
+	void onShapeHit(const PxControllerShapeHit& /*hit*/)
 	{
-		// printf("SHAPE HIT\n");
 	}
 
 	//-----------------------------------------------------------------------------
-	void onControllerHit(const PxControllersHit& hit)
+	void onControllerHit(const PxControllersHit& /*hit*/)
 	{
-		// printf("CONTROLLER HIT\n");
 	}
 
 	//-----------------------------------------------------------------------------
-	void onObstacleHit(const PxControllerObstacleHit& hit)
+	void onObstacleHit(const PxControllerObstacleHit& /*hit*/)
 	{
-		// printf("OBSTACLE HIT\n");
 	}
 };
 

+ 5 - 1
engine/physics/PhysicsTypes.h

@@ -157,14 +157,18 @@ struct EventType
 //-----------------------------------------------------------------------------
 struct CollisionEvent
 {
+	enum { BEGIN_TOUCH, END_TOUCH } type;
 	Actor* actors[2];
 	Vector3 where;
+	Vector3 normal;
 };
 
 //-----------------------------------------------------------------------------
 struct TriggerEvent
 {
-	Actor* actor;
+	enum { BEGIN_TOUCH, END_TOUCH } type;
+	Actor* trigger;
+	Actor* other;
 };
 
 } // namespace physics_world