Răsfoiți Sursa

implement overlap test in PhysicsWorld

mikymod 12 ani în urmă
părinte
comite
7d359be19a
2 a modificat fișierele cu 59 adăugiri și 10 ștergeri
  1. 44 2
      engine/physics/PhysicsWorld.cpp
  2. 15 8
      engine/physics/PhysicsWorld.h

+ 44 - 2
engine/physics/PhysicsWorld.cpp

@@ -39,6 +39,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "Actor.h"
 #include "ResourceManager.h"
 #include "Raycast.h"
+#include "Unit.h"
 
 #include "PxPhysicsAPI.h"
 
@@ -258,10 +259,10 @@ PhysicsWorld::~PhysicsWorld()
 }
 
 //-----------------------------------------------------------------------------
-ActorId	PhysicsWorld::create_actor(const PhysicsResource* res, const uint32_t index, SceneGraph& sg, int32_t node)
+ActorId	PhysicsWorld::create_actor(const PhysicsResource* res, const uint32_t index, SceneGraph& sg, int32_t node, Unit* unit)
 {
 	PhysicsConfigResource* config = (PhysicsConfigResource*) device()->resource_manager()->lookup("physics_config", "global");
-	Actor* actor = CE_NEW(m_actors_pool, Actor)(res, config, index, physics_system::s_physics, physics_system::s_cooking, m_scene, sg, node, Vector3::ZERO, Quaternion::IDENTITY);
+	Actor* actor = CE_NEW(m_actors_pool, Actor)(res, config, index, physics_system::s_physics, physics_system::s_cooking, m_scene, sg, node, unit, Vector3::ZERO, Quaternion::IDENTITY);
 	return m_actors.create(actor);
 }
 
@@ -432,6 +433,47 @@ void PhysicsWorld::overlap_test(const char* callback, SceneQueryMode::Enum mode,
 	}
 }
 
+//-----------------------------------------------------------------------------
+Actor* PhysicsWorld::sync_overlap_test(const char* callback, SceneQueryMode::Enum mode, SceneQueryFilter::Enum filter,
+									ShapeType::Enum type, const Vector3& pos, const Quaternion& rot, const Vector3& size)
+{
+	bool hit = false;
+	PxTransform transform(PxVec3(pos.x, pos.y, pos.x), PxQuat(rot.v.x, rot.v.y, rot.v.z, rot.w));
+
+	switch(type)
+	{
+		case ShapeType::SPHERE:	
+		{
+			PxSphereGeometry geometry(size.x);
+			hit = m_scene->overlap(geometry, transform, m_buffer);
+			break;
+		}
+		case ShapeType::CAPSULE:
+		{
+			PxCapsuleGeometry geometry(size.x, size.y);
+			hit = m_scene->overlap(geometry, transform, m_buffer);
+			break;
+		}
+		case ShapeType::BOX:
+		{
+			PxBoxGeometry geometry(size.x, size.y, size.z);
+			hit = m_scene->overlap(geometry, transform, m_buffer);
+			break;
+		}
+		default: CE_FATAL("Only spheres, capsules and boxs are supported in overlap test"); break;
+	}
+
+	if (hit)
+	{
+		PxOverlapHit oh = m_buffer.getAnyHit(0);
+		return (Actor*)(oh.actor->userData);
+	} 
+	else
+	{
+		return NULL;
+	}
+}
+
 //-----------------------------------------------------------------------------
 void PhysicsWorld::update(float dt)
 {

+ 15 - 8
engine/physics/PhysicsWorld.h

@@ -60,27 +60,30 @@ namespace physics_system
 } // namespace physics_system
 
 //-----------------------------------------------------------------------------
-struct PhysicsResource;
-struct PhysicsActor;
-struct Controller;
-struct Vector3;
-struct Matrix4x4;
+class SceneGraph;
 struct Actor;
+struct Actor;
+struct Controller;
 struct Joint;
+struct Matrix4x4;
+struct PhysicsActor;
+struct PhysicsResource;
 struct Quaternion;
-class SceneGraph;
-struct Actor;
 struct Raycast;
+struct Unit;
+struct Vector3;
 
 //-----------------------------------------------------------------------------
 class PhysicsWorld
 {
 public:
 
+	/// Constructor
 								PhysicsWorld();
+	/// Destroyer
 								~PhysicsWorld();
 
-	ActorId						create_actor(const PhysicsResource* res, const uint32_t index, SceneGraph& sg, int32_t node);
+	ActorId						create_actor(const PhysicsResource* res, const uint32_t index, SceneGraph& sg, int32_t node, Unit* unit);
 	void						destroy_actor(ActorId id);
 
 	ControllerId				create_controller(const PhysicsResource* pr, SceneGraph& sg, int32_t node);
@@ -103,9 +106,13 @@ public:
 	void						set_kinematic(ActorId id);
 	void						clear_kinematic(ActorId id);
 
+	/// Finds all actors in the physics world that are in a particular shape (supported: spheres, capsules and boxes)
 	void						overlap_test(const char* callback, SceneQueryMode::Enum mode, SceneQueryFilter::Enum filter,
 											ShapeType::Enum type, const Vector3& pos, const Quaternion& rot, const Vector3& size);
 
+	Actor*						sync_overlap_test(const char* callback, SceneQueryMode::Enum mode, SceneQueryFilter::Enum filter,
+											ShapeType::Enum type, const Vector3& pos, const Quaternion& rot, const Vector3& size);
+
 	void						update(float dt);
 
 public: