2 * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
15 k_walkspeed
= 20.0f
, /* no longer used */
17 k_board_radius
= 0.3f
,
18 k_board_length
= 0.45f
,
19 k_board_allowance
= 0.04f
,
20 k_friction_lat
= 8.8f
,
21 k_friction_resistance
= 0.01f
,
22 k_max_push_speed
= 16.0f
,
24 k_push_cycle_rate
= 8.0f
,
25 k_steer_ground
= 2.5f
,
27 k_steer_air_lerp
= 0.3f
,
30 k_walk_downforce
= 8.0f
,
31 k_jump_charge_speed
= (1.0f
/1.0f
),
35 k_walk_accel
= 150.0f
,
36 k_walk_friction
= 8.0f
;
38 static int freecam
= 0;
39 static int walk_grid_iterations
= 1;
40 static float fc_speed
= 10.0f
;
43 * -----------------------------------------------------------------------------
45 * -----------------------------------------------------------------------------
51 rigidbody collide_front
, collide_back
;
55 rigidbody rb
, rb_gate_frame
;
56 float iY
, siY
; /* Yaw inertia */
58 v3f a
, v_last
, m
, bob
, vl
;
61 float vswitch
, slip
, slip_last
,
64 float grab
, jump
, pushing
, push_time
;
66 int in_air
, on_board
, jump_charge
, jump_dir
;
73 m4x3f visual_transform
,
76 int is_dead
, death_tick_allowance
;
79 v3f land_target_log
[22];
80 u32 land_target_colours
[22];
83 v3f handl_target
, handr_target
,
89 v3f camera_pos
, smooth_localcam
;
91 m4x3f camera
, camera_inverse
;
115 struct skeleton_anim
*anim_stand
,
119 *anim_push
, *anim_push_reverse
,
120 *anim_ollie
, *anim_ollie_reverse
,
121 *anim_grabs
, *anim_stop
,
122 *anim_walk
, *anim_run
, *anim_idle
,
154 .collide_front
= { .type
= k_rb_shape_sphere
, .inf
.sphere
.radius
= 0.3f
},
155 .collide_back
= { .type
= k_rb_shape_sphere
, .inf
.sphere
.radius
= 0.3f
}
161 static float *player_get_pos(void);
162 static void player_kill(void);
163 static float *player_cam_pos(void);
164 static void player_save_frame(void);
165 static void player_restore_frame(void);
170 #include "player_physics.h"
171 #include "player_ragdoll.h"
172 #include "player_model.h"
173 #include "player_animation.h"
174 #include "player_audio.h"
177 * -----------------------------------------------------------------------------
179 * -----------------------------------------------------------------------------
182 static void player_init(void) /* 1 */
184 rb_init( &player
.phys
.rb
);
185 rb_init( &player
.collide_front
);
186 rb_init( &player
.collide_back
);
188 vg_convar_push( (struct vg_convar
){
189 .name
= "walk_speed",
190 .data
= &k_walkspeed
,
191 .data_type
= k_convar_dtype_f32
,
192 .opt_f32
= { .clamp
= 0 },
196 vg_convar_push( (struct vg_convar
){
199 .data_type
= k_convar_dtype_f32
,
200 .opt_f32
= { .clamp
= 0 },
204 vg_convar_push( (struct vg_convar
){
205 .name
= "walk_accel",
206 .data
= &k_walk_accel
,
207 .data_type
= k_convar_dtype_f32
,
208 .opt_f32
= { .clamp
= 0 },
212 vg_convar_push( (struct vg_convar
){
215 .data_type
= k_convar_dtype_i32
,
216 .opt_i32
= { .min
=0, .max
=1, .clamp
=1 },
220 vg_convar_push( (struct vg_convar
){
223 .data_type
= k_convar_dtype_f32
,
224 .opt_f32
= { .clamp
= 0 },
228 vg_function_push( (struct vg_cmd
){
230 .function
= reset_player
234 vg_loader_highwater( player_model_init
, player_model_free
, NULL
);
237 /* Deal with input etc */
238 static void player_update_pre(void)
240 struct player_phys
*phys
= &player
.phys
;
242 if( vg_get_button_down( "reset" ) )
245 player
.death_tick_allowance
= 30;
246 player_restore_frame();
248 if( !phys
->on_board
)
250 player
.angles
[0] = atan2f( -phys
->rb
.forward
[2],
251 -phys
->rb
.forward
[0] );
254 player
.mdl
.shoes
[0] = 1;
255 player
.mdl
.shoes
[1] = 1;
257 world_routes_notify_reset();
260 if( vg_get_button_down( "switchmode" ) )
262 phys
->on_board
^= 0x1;
266 v3_muladds( phys
->rb
.v
, phys
->rb
.forward
, 0.2f
, phys
->rb
.v
);
271 static void player_update_fixed(void) /* 2 */
273 if( player
.death_tick_allowance
)
274 player
.death_tick_allowance
--;
276 struct player_phys
*phys
= &player
.phys
;
280 player_ragdoll_iter();
287 player_audio(); /* FUTURE: can probably move this to post()
288 BUT, it uses deltas from fixed step physics,
289 AND this *might* be what we want for realtime
293 static void player_update_post(void)
295 for( int i
=0; i
<player
.land_log_count
; i
++ )
296 vg_line_cross( player
.land_target_log
[i
],
297 player
.land_target_colours
[i
], 0.25f
);
301 player_debug_ragdoll();
304 player_animate_death_cam();
311 player_animate_camera();
317 player_camera_update();
320 static void draw_player(void) /* 3 */
323 player_model_copy_ragdoll();
325 shader_viewchar_use();
326 vg_tex2d_bind( &tex_characters
, 0 );
327 shader_viewchar_uTexMain( 0 );
328 shader_viewchar_uCamera( player
.camera
[3] );
329 shader_viewchar_uPv( vg
.pv
);
330 shader_link_standard_ub( _shader_viewchar
.id
, 2 );
331 glUniformMatrix4x3fv( _uniform_viewchar_uTransforms
,
332 player
.mdl
.sk
.bone_count
,
334 (float *)player
.mdl
.sk
.final_mtx
);
336 mesh_bind( &player
.mdl
.mesh
);
337 mesh_draw( &player
.mdl
.mesh
);
341 * -----------------------------------------------------------------------------
343 * -----------------------------------------------------------------------------
346 static float *player_get_pos(void)
348 return player
.phys
.rb
.co
;
351 static void player_kill(void)
353 if( player
.death_tick_allowance
== 0 )
356 player_ragdoll_copy_model( player
.phys
.rb
.v
);
360 static float *player_cam_pos(void)
362 return player
.camera_pos
;
366 #endif /* PLAYER_H */