فهرست منبع

Improve Controller

Daniele Bartolini 12 سال پیش
والد
کامیت
8c4f482df8
3فایلهای تغییر یافته به همراه53 افزوده شده و 6 حذف شده
  1. 13 1
      engine/lua/LuaController.cpp
  2. 33 4
      engine/physics/Controller.cpp
  3. 7 1
      engine/physics/Controller.h

+ 13 - 1
engine/lua/LuaController.cpp

@@ -44,10 +44,22 @@ CE_EXPORT int controller_move(lua_State* L)
 	return 0;
 }
 
+//-----------------------------------------------------------------------------
+CE_EXPORT int controller_position(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Controller* controller = stack.get_controller(1);
+
+	stack.push_vector3(controller->position());
+	return 1;
+}
+
 //-----------------------------------------------------------------------------
 void load_controller(LuaEnvironment& env)
 {
-	env.load_module_function("Controller", "move",    controller_move);
+	env.load_module_function("Controller", "move",        controller_move);
+	env.load_module_function("Controller", "position",    controller_position);
 }
 
 } // namespace crown

+ 33 - 4
engine/physics/Controller.cpp

@@ -25,22 +25,28 @@ OTHER DEALINGS IN THE SOFTWARE.
 */
 
 #include "Controller.h"
+#include "Device.h"
 #include "MathUtils.h"
 #include "PhysicsResource.h"
-#include "Device.h"
+#include "SceneGraph.h"
 #include "Vector3.h"
 
 #include "PxCapsuleController.h"
+using physx::PxCapsuleClimbingMode;
 using physx::PxCapsuleController;
 using physx::PxCapsuleControllerDesc;
+using physx::PxControllerFilters;
+using physx::PxExtendedVec3;
 using physx::PxVec3;
 
 namespace crown
 {
 
 //-----------------------------------------------------------------------------
-Controller::Controller(const PhysicsResource* pr, PxScene* scene, PxControllerManager* manager)
+Controller::Controller(const PhysicsResource* pr, SceneGraph& sg, int32_t node, PxScene* scene, PxControllerManager* manager)
 	: m_resource(pr)
+	, m_scene_graph(sg)
+	, m_node(node)
 	, m_scene(scene)
 	, m_manager(manager)
 	, m_controller(NULL)
@@ -48,26 +54,49 @@ Controller::Controller(const PhysicsResource* pr, PxScene* scene, PxControllerMa
 	const PhysicsController contr = pr->controller();
 
 	PxCapsuleControllerDesc desc;
+	desc.climbingMode = PxCapsuleClimbingMode::eEASY;
 	desc.radius = math::cos(contr.radius);
 	desc.height = contr.height;
 	desc.slopeLimit = contr.slope_limit;
 	desc.stepOffset = contr.step_offset;
 	desc.contactOffset = contr.contact_offset;
 	desc.upDirection = PxVec3(0.0, 1.0, 0.0);
+	desc.material = device()->physx()->createMaterial(0.5f, 0.5f, 0.5f);
+	desc.position = PxExtendedVec3(0, 0, 0);
+	desc.invisibleWallHeight	= 0.0f;
+	desc.maxJumpHeight			= 2.0f;
+	desc.scaleCoeff				= 0.9f;
+
+	CE_ASSERT(desc.isValid(), "Capsule is not valid");
 
 	m_controller = manager->createController(*device()->physx(), scene, desc);
+	CE_ASSERT(m_controller, "Failed to create controller");
 }
 
 //-----------------------------------------------------------------------------
 Controller::~Controller()
 {
-	// FIXME
+	m_controller->release();
 }
 
 //-----------------------------------------------------------------------------
 void Controller::move(const Vector3& pos)
 {
-	// FIXME
+	PxVec3 disp(pos.x, pos.y, pos.z);
+	m_controller->move(disp, 0.01, 1.0 / 60.0, PxControllerFilters());
+}
+
+//-----------------------------------------------------------------------------
+Vector3 Controller::position() const
+{
+	PxExtendedVec3 pos = m_controller->getPosition();
+	return Vector3(pos.x, pos.y, pos.z);
+}
+
+//-----------------------------------------------------------------------------
+void Controller::update()
+{
+	m_scene_graph.set_world_position(m_node, position());
 }
 
 } // namespace crown

+ 7 - 1
engine/physics/Controller.h

@@ -36,18 +36,24 @@ namespace crown
 
 struct PhysicsResource;
 class Vector3;
+class SceneGraph;
 
 struct Controller
 {
-							Controller(const PhysicsResource* pr, PxScene* scene, PxControllerManager* manager);
+							Controller(const PhysicsResource* pr, SceneGraph& sg, int32_t node, PxScene* scene, PxControllerManager* manager);
 							~Controller();
 
 	void					move(const Vector3& pos);
 
+	Vector3					position() const;
+	void					update();
+
 private:
 
 	const PhysicsResource*	m_resource;
 
+	SceneGraph&				m_scene_graph;
+	int32_t					m_node;
 	PxScene*				m_scene;
 	PxControllerManager*	m_manager;
 	PxController*			m_controller;