Daniele Bartolini 12 лет назад
Родитель
Сommit
a2adc944e7
3 измененных файлов с 17 добавлено и 15 удалено
  1. 6 2
      engine/physics/Actor.cpp
  2. 3 1
      engine/physics/Actor.h
  3. 8 12
      engine/physics/PhysicsWorld.cpp

+ 6 - 2
engine/physics/Actor.cpp

@@ -57,8 +57,9 @@ namespace crown
 {
 	
 //-----------------------------------------------------------------------------
-Actor::Actor(SceneGraph& sg, int32_t node, ActorType::Enum type, const Vector3& pos, const Quaternion& rot)
-	: m_scene_graph(sg)
+Actor::Actor(PxScene* scene, SceneGraph& sg, int32_t node, ActorType::Enum type, const Vector3& pos, const Quaternion& rot)
+	: m_scene(scene)
+	, m_scene_graph(sg)
 	, m_node(node)
 	, m_type(type)
 {
@@ -104,6 +105,8 @@ Actor::Actor(SceneGraph& sg, int32_t node, ActorType::Enum type, const Vector3&
 	//joint->setMotion(PxD6Axis::eZ, PxD6Motion::eFREE);
 	//joint->setMotion(PxD6Axis::eSWING1, PxD6Motion::eFREE);
 	joint->setMotion(PxD6Axis::eSWING2, PxD6Motion::eFREE);
+
+	m_scene->addActor(*m_actor);
 }
 
 //-----------------------------------------------------------------------------
@@ -111,6 +114,7 @@ Actor::~Actor()
 {
 	if (m_actor)
 	{
+		m_scene->removeActor(*m_actor);
 		m_actor->release();
 	}
 }

+ 3 - 1
engine/physics/Actor.h

@@ -38,6 +38,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 
 using physx::PxRigidActor;
 using physx::PxMaterial;
+using physx::PxScene;
 
 namespace crown
 {
@@ -50,7 +51,7 @@ class SceneGraph;
 
 struct Actor
 {
-						Actor(SceneGraph& sg, int32_t node, ActorType::Enum type, const Vector3& pos, const Quaternion& rot);
+						Actor(PxScene* scene, SceneGraph& sg, int32_t node, ActorType::Enum type, const Vector3& pos, const Quaternion& rot);
 						~Actor();
 
 	void				enable_gravity();
@@ -88,6 +89,7 @@ private:
 	
 public:
 
+	PxScene*			m_scene;
 	SceneGraph&			m_scene_graph;
 	int32_t				m_node;
 	PxRigidActor* 		m_actor;

+ 8 - 12
engine/physics/PhysicsWorld.cpp

@@ -60,8 +60,7 @@ PhysicsWorld::PhysicsWorld()
 	, m_actors_pool(default_allocator(), MAX_ACTORS, sizeof(Actor), CE_ALIGNOF(Actor))
 	, m_controllers_pool(default_allocator(), MAX_CONTROLLERS, sizeof(Controller), CE_ALIGNOF(Controller))
 {
-	m_controller_manager = PxCreateControllerManager(device()->physx()->getFoundation());
-
+	// Create scene
 	PxSceneDesc scene_desc(device()->physx()->getTolerancesScale());
 	scene_desc.gravity = PxVec3(0.0f, -9.81f, 0.0f);
 
@@ -79,8 +78,9 @@ PhysicsWorld::PhysicsWorld()
 	m_scene = device()->physx()->createScene(scene_desc);
 	m_scene->setFlag(PxSceneFlag::eENABLE_ACTIVETRANSFORMS, true);
 
-/*	m_scene->setVisualizationParameter(PxVisualizationParameter::eSCALE,				 1.0);
-	m_scene->setVisualizationParameter(PxVisualizationParameter::eCOLLISION_SHAPES,	1.0f);*/
+	// Create controller manager
+	m_controller_manager = PxCreateControllerManager(device()->physx()->getFoundation());
+	CE_ASSERT(m_controller_manager != NULL, "Failed to create PhysX controller manager");
 
 	PxTransform pose = PxTransform(PxVec3(0.0f, -3.75, 0.0f), PxQuat(PxHalfPi, PxVec3(0.0f, 0.0f, 1.0f)));
 	PxMaterial* mat = device()->physx()->createMaterial(0.5f, 0.5f, 1.0f);
@@ -92,15 +92,15 @@ PhysicsWorld::PhysicsWorld()
 //-----------------------------------------------------------------------------
 PhysicsWorld::~PhysicsWorld()
 {
+	m_cpu_dispatcher->release();
+	m_controller_manager->release();
 	m_scene->release();
 }
 
 //-----------------------------------------------------------------------------
 ActorId	PhysicsWorld::create_actor(SceneGraph& sg, int32_t node, ActorType::Enum type)
 {
-	Actor* actor = CE_NEW(m_actors_pool, Actor)(sg, node, type, Vector3::ZERO, Quaternion::IDENTITY);
-	m_scene->addActor(*actor->m_actor);
-
+	Actor* actor = CE_NEW(m_actors_pool, Actor)(m_scene, sg, node, type, Vector3::ZERO, Quaternion::IDENTITY);
 	return m_actors.create(actor);
 }
 
@@ -109,11 +109,7 @@ void PhysicsWorld::destroy_actor(ActorId id)
 {
 	CE_ASSERT(m_actors.has(id), "Actor does not exist");
 
-	Actor* actor = m_actors.lookup(id);
-	CE_DELETE(m_actors_pool, actor);
-
-	m_scene->removeActor(*actor->m_actor);
-
+	CE_DELETE(m_actors_pool, m_actors.lookup(id));
 	m_actors.destroy(id);
 }