Переглянути джерело

Add Controller::collides_up/down/sides() and tweak a couple of params

Daniele Bartolini 12 роки тому
батько
коміт
693f1eb90c

+ 38 - 2
engine/lua/LuaController.cpp

@@ -55,11 +55,47 @@ CE_EXPORT int controller_position(lua_State* L)
 	return 1;
 }
 
+//-----------------------------------------------------------------------------
+CE_EXPORT int controller_collides_up(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Controller* controller = stack.get_controller(1);
+
+	stack.push_bool(controller->collides_up());
+	return 1;
+}
+
+//-----------------------------------------------------------------------------
+CE_EXPORT int controller_collides_down(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Controller* controller = stack.get_controller(1);
+
+	stack.push_bool(controller->collides_down());
+	return 1;
+}
+
+//-----------------------------------------------------------------------------
+CE_EXPORT int controller_collides_sides(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Controller* controller = stack.get_controller(1);
+
+	stack.push_bool(controller->collides_sides());
+	return 1;
+}
+
 //-----------------------------------------------------------------------------
 void load_controller(LuaEnvironment& env)
 {
-	env.load_module_function("Controller", "move",        controller_move);
-	env.load_module_function("Controller", "position",    controller_position);
+	env.load_module_function("Controller", "move",           controller_move);
+	env.load_module_function("Controller", "position",       controller_position);
+	env.load_module_function("Controller", "collides_up",    controller_collides_up);
+	env.load_module_function("Controller", "collides_down",  controller_collides_down);
+	env.load_module_function("Controller", "collides_sides", controller_collides_sides);
 }
 
 } // namespace crown

+ 23 - 2
engine/physics/Controller.cpp

@@ -35,7 +35,9 @@ OTHER DEALINGS IN THE SOFTWARE.
 using physx::PxCapsuleClimbingMode;
 using physx::PxCapsuleController;
 using physx::PxCapsuleControllerDesc;
+using physx::PxCCTNonWalkableMode;
 using physx::PxControllerFilters;
+using physx::PxControllerFlag;
 using physx::PxExtendedVec3;
 using physx::PxVec3;
 
@@ -54,7 +56,8 @@ Controller::Controller(const PhysicsResource* pr, SceneGraph& sg, int32_t node,
 	const PhysicsController contr = pr->controller();
 
 	PxCapsuleControllerDesc desc;
-	desc.climbingMode = PxCapsuleClimbingMode::eEASY;
+	desc.climbingMode = PxCapsuleClimbingMode::eCONSTRAINED;
+	desc.nonWalkableMode = PxCCTNonWalkableMode::eFORCE_SLIDING;
 	desc.radius = math::cos(contr.radius);
 	desc.height = contr.height;
 	desc.slopeLimit = contr.slope_limit;
@@ -83,7 +86,7 @@ Controller::~Controller()
 void Controller::move(const Vector3& pos)
 {
 	PxVec3 disp(pos.x, pos.y, pos.z);
-	m_controller->move(disp, 0.01, 1.0 / 60.0, PxControllerFilters());
+	m_flags = m_controller->move(disp, 0.001, 1.0 / 60.0, PxControllerFilters());
 }
 
 //-----------------------------------------------------------------------------
@@ -93,6 +96,24 @@ Vector3 Controller::position() const
 	return Vector3(pos.x, pos.y, pos.z);
 }
 
+//-----------------------------------------------------------------------------
+bool Controller::collides_up() const
+{
+	return m_flags & PxControllerFlag::eCOLLISION_UP;
+}
+
+//-----------------------------------------------------------------------------
+bool Controller::collides_down() const
+{
+	return m_flags & PxControllerFlag::eCOLLISION_DOWN;
+}
+
+//-----------------------------------------------------------------------------
+bool Controller::collides_sides() const
+{
+	return m_flags & PxControllerFlag::eCOLLISION_SIDES;
+}
+
 //-----------------------------------------------------------------------------
 void Controller::update()
 {

+ 6 - 0
engine/physics/Controller.h

@@ -30,6 +30,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 using physx::PxController;
 using physx::PxControllerManager;
 using physx::PxScene;
+using physx::PxU32;
 
 namespace crown
 {
@@ -45,6 +46,10 @@ struct Controller
 
 	void					move(const Vector3& pos);
 
+	bool					collides_up() const;
+	bool					collides_down() const;
+	bool					collides_sides() const;
+
 	Vector3					position() const;
 	void					update();
 
@@ -57,6 +62,7 @@ private:
 	PxScene*				m_scene;
 	PxControllerManager*	m_manager;
 	PxController*			m_controller;
+	PxU32					m_flags;
 };
 
 } // namespace crown