Explorar el Código

add kinematics methods in Actor

mikymod hace 12 años
padre
commit
703c83e198
Se han modificado 3 ficheros con 53 adiciones y 2 borrados
  1. 26 1
      engine/lua/LuaActor.cpp
  2. 25 1
      engine/physics/Actor.cpp
  3. 2 0
      engine/physics/Actor.h

+ 26 - 1
engine/lua/LuaActor.cpp

@@ -96,6 +96,18 @@ CE_EXPORT int actor_clear_kinematic(lua_State* L)
 	return 0;
 }
 
+//-----------------------------------------------------------------------------
+CE_EXPORT int actor_move(lua_State* L)
+{
+	LuaStack stack(L);
+	Actor* actor = stack.get_actor(1);
+	Matrix4x4 pose = stack.get_matrix4x4(2);
+
+	actor->move(pose);
+
+	return 0;
+}
+
 //-----------------------------------------------------------------------------
 CE_EXPORT int actor_is_static(lua_State* L)
 {
@@ -118,6 +130,17 @@ CE_EXPORT int actor_is_dynamic(lua_State* L)
 	return 1;
 }
 
+//-----------------------------------------------------------------------------
+CE_EXPORT int actor_is_kinematic(lua_State* L)
+{
+	LuaStack stack(L);
+
+	Actor* actor = stack.get_actor(1);
+
+	stack.push_bool(actor->is_kinematic());
+	return 1;
+}
+
 //-----------------------------------------------------------------------------
 CE_EXPORT int actor_linear_damping(lua_State* L)
 {
@@ -282,8 +305,10 @@ void load_actor(LuaEnvironment& env)
 	env.load_module_function("Actor", "disable_collision",		actor_disable_collision);
 	env.load_module_function("Actor", "set_kinematic",			actor_set_kinematic);
 	env.load_module_function("Actor", "clear_kinematic",		actor_clear_kinematic);
+	env.load_module_function("Actor", "move",					actor_move);
 	env.load_module_function("Actor", "is_static",				actor_is_static);
 	env.load_module_function("Actor", "is_dynamic",				actor_is_dynamic);
+	env.load_module_function("Actor", "is_kinematic",			actor_is_kinematic);
 	env.load_module_function("Actor", "linear_damping",			actor_linear_damping);
 	env.load_module_function("Actor", "set_linear_damping",		actor_set_linear_damping);
 	env.load_module_function("Actor", "angular_damping",		actor_angular_damping);
@@ -299,4 +324,4 @@ void load_actor(LuaEnvironment& env)
 	env.load_module_function("Actor", "wake_up",				actor_wake_up);
 }
 
-} // namespace crown
+} // namespace crown

+ 25 - 1
engine/physics/Actor.cpp

@@ -263,7 +263,7 @@ void Actor::disable_collision()
 	// 	shape->setSimulationFilterData(filter_data);
 	// }
 
-	// default_allocator().deallocate(shapes);	
+	// default_allocator().deallocate(shapes);
 }
 
 //-----------------------------------------------------------------------------
@@ -276,6 +276,30 @@ void Actor::set_kinematic()
 void Actor::clear_kinematic()
 {
 	static_cast<PxRigidDynamic*>(m_actor)->setRigidDynamicFlag(PxRigidDynamicFlag::eKINEMATIC, false);
+
+	m_scene_graph.set_world_pose(m_node, get_kinematic_pose());
+}
+
+//-----------------------------------------------------------------------------
+void Actor::move(const Matrix4x4& pose)
+{
+	CE_ASSERT(is_kinematic(), "Cannot call 'move' method for non-kinematic actor");
+
+	Vector3 tmp = pose.translation();
+	PxVec3 pos(tmp.x, tmp.y, tmp.z);
+	static_cast<PxRigidDynamic*>(m_actor)->setKinematicTarget(PxTransform(pos));
+}
+
+//-----------------------------------------------------------------------------
+Matrix4x4 Actor::get_kinematic_pose() const
+{
+	PxTransform transform;
+	static_cast<PxRigidDynamic*>(m_actor)->getKinematicTarget(transform);
+
+	Quaternion rot(transform.q.x, transform.q.y, transform.q.z, transform.q.w);
+	Vector3 pos(transform.p.x, transform.p.y, transform.p.z);
+	
+	return Matrix4x4(rot, pos);
 }
 
 //-----------------------------------------------------------------------------

+ 2 - 0
engine/physics/Actor.h

@@ -70,6 +70,8 @@ struct Actor
 
 	void				set_kinematic();
 	void				clear_kinematic();
+	void				move(const Matrix4x4& pose);
+	Matrix4x4			get_kinematic_pose() const;
 
 	/// Returns whether the actor is static (i.e. immovable).
 	bool				is_static() const;