@@ -8,10 +8,12 @@ use rapier_testbed2d::{
88 KeyCode , PhysicsState , TestbedGraphics ,
99} ;
1010
11- #[ derive( PartialEq , Eq , Clone , Copy , Debug ) ]
11+ pub type CharacterSpeed = Real ;
12+
13+ #[ derive( PartialEq , Clone , Copy , Debug ) ]
1214pub enum CharacterControlMode {
13- Kinematic ,
14- Pid ,
15+ Kinematic ( CharacterSpeed ) ,
16+ Pid ( CharacterSpeed ) ,
1517}
1618
1719pub fn update_character (
@@ -27,28 +29,28 @@ pub fn update_character(
2729
2830 if * control_mode != prev_control_mode {
2931 match control_mode {
30- CharacterControlMode :: Kinematic => physics. bodies [ character_handle]
32+ CharacterControlMode :: Kinematic ( _ ) => physics. bodies [ character_handle]
3133 . set_body_type ( RigidBodyType :: KinematicPositionBased , false ) ,
32- CharacterControlMode :: Pid => {
34+ CharacterControlMode :: Pid ( _ ) => {
3335 physics. bodies [ character_handle] . set_body_type ( RigidBodyType :: Dynamic , true )
3436 }
3537 }
3638 }
3739
3840 match * control_mode {
39- CharacterControlMode :: Kinematic => {
40- update_kinematic_controller ( graphics, physics, character_handle, controller)
41+ CharacterControlMode :: Kinematic ( speed ) => {
42+ update_kinematic_controller ( graphics, physics, character_handle, controller, speed )
4143 }
42- CharacterControlMode :: Pid => {
43- update_pid_controller ( graphics, physics, character_handle, pid)
44+ CharacterControlMode :: Pid ( speed ) => {
45+ update_pid_controller ( graphics, physics, character_handle, pid, speed )
4446 }
4547 }
4648}
4749
4850fn character_movement_from_inputs (
4951 gfx : & TestbedGraphics ,
5052 mut speed : Real ,
51- artificial_gravity : bool ,
53+ artificial_gravity : Option < Real > ,
5254) -> Vector < Real > {
5355 let mut desired_movement = Vector :: zeros ( ) ;
5456
@@ -75,8 +77,8 @@ fn character_movement_from_inputs(
7577
7678 desired_movement *= speed;
7779
78- if artificial_gravity {
79- desired_movement - = Vector :: y ( ) * speed ;
80+ if let Some ( artificial_gravity ) = artificial_gravity {
81+ desired_movement + = Vector :: y ( ) * artificial_gravity ;
8082 }
8183
8284 desired_movement
@@ -87,8 +89,10 @@ fn update_pid_controller(
8789 phx : & mut PhysicsState ,
8890 character_handle : RigidBodyHandle ,
8991 pid : & mut PidController ,
92+ speed : Real ,
9093) {
91- let desired_movement = character_movement_from_inputs ( gfx, 0.1 , false ) ;
94+ let desired_movement = character_movement_from_inputs ( gfx, speed, None ) ;
95+
9296 let character_body = & mut phx. bodies [ character_handle] ;
9397
9498 // Adjust the controlled axis depending on the keys pressed by the user.
@@ -123,9 +127,9 @@ fn update_kinematic_controller(
123127 phx : & mut PhysicsState ,
124128 character_handle : RigidBodyHandle ,
125129 controller : & KinematicCharacterController ,
130+ speed : Real ,
126131) {
127- let speed = 0.1 ;
128- let desired_movement = character_movement_from_inputs ( gfx, speed, true ) ;
132+ let desired_movement = character_movement_from_inputs ( gfx, speed, Some ( phx. gravity . y ) ) ;
129133
130134 let character_body = & phx. bodies [ character_handle] ;
131135 let character_collider = & phx. colliders [ character_body. colliders ( ) [ 0 ] ] ;
@@ -139,7 +143,7 @@ fn update_kinematic_controller(
139143 & phx. query_pipeline ,
140144 character_collider. shape ( ) ,
141145 character_collider. position ( ) ,
142- desired_movement. cast :: < Real > ( ) ,
146+ desired_movement,
143147 QueryFilter :: new ( ) . exclude_rigid_body ( character_handle) ,
144148 |c| collisions. push ( c) ,
145149 ) ;
@@ -178,29 +182,34 @@ fn character_control_ui(
178182 ComboBox :: from_label ( "control mode" )
179183 . selected_text ( format ! ( "{:?}" , * control_mode) )
180184 . show_ui ( ui, |ui| {
181- ui. selectable_value ( control_mode, CharacterControlMode :: Kinematic , "Kinematic" ) ;
182- ui. selectable_value ( control_mode, CharacterControlMode :: Pid , "Pid" ) ;
185+ ui. selectable_value (
186+ control_mode,
187+ CharacterControlMode :: Kinematic ( 0.1 ) ,
188+ "Kinematic" ,
189+ ) ;
190+ ui. selectable_value ( control_mode, CharacterControlMode :: Pid ( 0.1 ) , "Pid" ) ;
183191 } ) ;
184192
185193 match control_mode {
186- CharacterControlMode :: Kinematic => {
187- kinematic_control_ui ( ui, character_controller) ;
194+ CharacterControlMode :: Kinematic ( speed ) => {
195+ kinematic_control_ui ( ui, character_controller, speed ) ;
188196 }
189- CharacterControlMode :: Pid => {
190- pid_control_ui ( ui, pid_controller) ;
197+ CharacterControlMode :: Pid ( speed ) => {
198+ pid_control_ui ( ui, pid_controller, speed ) ;
191199 }
192200 }
193201 } ) ;
194202}
195203
196- fn pid_control_ui ( ui : & mut Ui , pid_controller : & mut PidController ) {
204+ fn pid_control_ui ( ui : & mut Ui , pid_controller : & mut PidController , speed : & mut Real ) {
197205 let mut lin_kp = pid_controller. pd . lin_kp . x ;
198206 let mut lin_ki = pid_controller. lin_ki . x ;
199207 let mut lin_kd = pid_controller. pd . lin_kd . x ;
200208 let mut ang_kp = pid_controller. pd . ang_kp ;
201209 let mut ang_ki = pid_controller. ang_ki ;
202210 let mut ang_kd = pid_controller. pd . ang_kd ;
203211
212+ ui. add ( Slider :: new ( speed, 0.0 ..=1.0 ) . text ( "speed" ) ) ;
204213 ui. add ( Slider :: new ( & mut lin_kp, 0.0 ..=100.0 ) . text ( "linear Kp" ) ) ;
205214 ui. add ( Slider :: new ( & mut lin_ki, 0.0 ..=10.0 ) . text ( "linear Ki" ) ) ;
206215 ui. add ( Slider :: new ( & mut lin_kd, 0.0 ..=1.0 ) . text ( "linear Kd" ) ) ;
@@ -216,7 +225,13 @@ fn pid_control_ui(ui: &mut Ui, pid_controller: &mut PidController) {
216225 pid_controller. pd . ang_kd = ang_kd;
217226}
218227
219- fn kinematic_control_ui ( ui : & mut Ui , character_controller : & mut KinematicCharacterController ) {
228+ fn kinematic_control_ui (
229+ ui : & mut Ui ,
230+ character_controller : & mut KinematicCharacterController ,
231+ speed : & mut Real ,
232+ ) {
233+ ui. add ( Slider :: new ( speed, 0.0 ..=1.0 ) . text ( "Speed" ) )
234+ . on_hover_text ( "The speed applied each simulation tick." ) ;
220235 ui. checkbox ( & mut character_controller. slide , "slide" )
221236 . on_hover_text ( "Should the character try to slide against the floor if it hits it?" ) ;
222237 #[ allow( clippy:: useless_conversion) ]
0 commit comments