X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_physics.h;h=7594f13a50efe078ec2dc439fe5e4b124d9b1bde;hb=5ecf9cca8b5b9bf876d7e7c7fde03d5b187bb42b;hp=f9584a2cd3fb916d4e7c1b8305f08bc8c0dfad2d;hpb=86dbcd5796ed674ca9433cce1ace8bef322cd121;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_physics.h b/player_physics.h index f9584a2..7594f13 100644 --- a/player_physics.h +++ b/player_physics.h @@ -1,11 +1,5 @@ /* - * Copyright 2021-2022 (C) Mount0 Software, Harry Godden - All Rights Reserved - * ----------------------------------------------------------------------------- - * - * Player physics and control submodule - * contains main physics models, input, and player control. - * - * ----------------------------------------------------------------------------- + * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved */ #ifndef PLAYER_PHYSICS_H @@ -31,7 +25,7 @@ static void player_start_air(void) phys->in_air = 1; - float pstep = ktimestep*10.0f; + float pstep = VG_TIMESTEP_FIXED * 10.0f; float best_velocity_delta = -9999.9f; float k_bias = 0.96f; @@ -140,7 +134,7 @@ static void player_physics_control(void) phys->slip = slip; phys->reverse = -vg_signf(vel[2]); - float substep = ktimestep * 0.2f; + float substep = VG_TIMESTEP_FIXED * 0.2f; float fwd_resistance = (vg_get_button( "break" )? 5.0f: 0.02f) * -substep; for( int i=0; i<5; i++ ) @@ -150,13 +144,9 @@ static void player_physics_control(void) vg_signf( vel[0] ) * -k_friction_lat*substep ); } - static double start_push = 0.0; - if( vg_get_button_down( "push" ) ) - start_push = vg_time; - if( vg_get_button( "jump" ) ) { - phys->jump += ktimestep * k_jump_charge_speed; + phys->jump += VG_TIMESTEP_FIXED * k_jump_charge_speed; if( !phys->jump_charge ) phys->jump_dir = phys->reverse > 0.0f? 1: 0; @@ -164,13 +154,20 @@ static void player_physics_control(void) phys->jump_charge = 1; } + static int push_button_last = 0; + int push_button = vg_get_button( "push" ); + push_button_last = push_button; + + if( push_button && !push_button_last ) + player.phys.start_push = vg.time; + if( !vg_get_button("break") && vg_get_button( "push" ) ) { - player.pushing = 1.0f; - player.push_time = vg_time-start_push; + player.phys.pushing = 1.0f; + player.phys.push_time = vg.time - player.phys.start_push; - float cycle_time = player.push_time*k_push_cycle_rate, - amt = k_push_accel * (sinf(cycle_time)*0.5f+0.5f)*ktimestep, + float cycle_time = player.phys.push_time*k_push_cycle_rate, + amt = k_push_accel * (sinf(cycle_time)*0.5f+0.5f)*VG_TIMESTEP_FIXED, current = v3_length( vel ), new_vel = vg_minf( current + amt, k_max_push_speed ); @@ -181,7 +178,7 @@ static void player_physics_control(void) /* Pumping */ static float previous = 0.0f; float delta = previous - phys->grab, - pump = delta * k_pump_force*ktimestep; + pump = delta * k_pump_force * VG_TIMESTEP_FIXED; previous = phys->grab; v3f p1; @@ -193,8 +190,10 @@ static void player_physics_control(void) m3x3_mulv( phys->rb.to_world, vel, phys->rb.v ); - float steer = vg_get_axis( "horizontal" ); - phys->iY -= vg_signf(steer)*powf(steer,2.0f) * k_steer_ground * ktimestep; + float steer = vg_get_axis( "horizontal" ), + steer_scaled = vg_signf(steer) * powf(steer,2.0f) * k_steer_ground; + + phys->iY -= steer_scaled * VG_TIMESTEP_FIXED; } /* @@ -212,7 +211,7 @@ static void player_physics_control_air(void) /* * Prediction */ - float pstep = ktimestep*10.0f; + float pstep = VG_TIMESTEP_FIXED * 10.0f; v3f pco, pco1, pv; v3_copy( phys->rb.co, pco ); @@ -261,10 +260,10 @@ static void player_physics_control_air(void) time_to_impact += pstep; } - phys->iY -= vg_get_axis( "horizontal" ) * k_steer_air * ktimestep; + phys->iY -= vg_get_axis( "horizontal" ) * k_steer_air * VG_TIMESTEP_FIXED; { float iX = vg_get_axis( "vertical" ) * - phys->reverse * k_steer_air * limiter * ktimestep; + phys->reverse * k_steer_air * limiter * VG_TIMESTEP_FIXED; static float siX = 0.0f; siX = vg_lerpf( siX, iX, k_steer_air_lerp ); @@ -364,13 +363,13 @@ static void player_walk_physics(void) vg_line( phys->rb.co, p1, 0xff0000ff ); float move_dead = 0.1f, - move = vg_get_axis("grabr")*0.5f + 0.5f - move_dead; + move = vg_get_axis("grabl")*0.5f + 0.5f - move_dead; if( move > 0.0f ) { float move_norm = move * (1.0f/(1.0f-move_dead)), speed = vg_lerpf( 0.1f*k_runspeed, k_runspeed, move_norm ), - amt = k_walk_accel * ktimestep, + amt = k_walk_accel * VG_TIMESTEP_FIXED, zvel = v3_dot( phys->rb.v, forward_dir ), new_vel = vg_minf( zvel + amt, speed ), diff = new_vel - vg_minf( zvel, speed ); @@ -379,17 +378,18 @@ static void player_walk_physics(void) /* TODO move */ float walk_norm = 30.0f/(float)player.mdl.anim_walk->length, - run_norm = 30.0f/(float)player.mdl.anim_run->length ; + run_norm = 30.0f/(float)player.mdl.anim_run->length, + walk_adv = vg_lerpf( walk_norm,run_norm,move_norm ); - player.walk_timer += ktimestep * vg_lerpf( walk_norm,run_norm,move_norm ); + player.walk_timer += walk_adv * VG_TIMESTEP_FIXED; } else { player.walk_timer = 0.0f; } - phys->rb.v[0] *= 1.0f - (ktimestep*k_walk_friction); - phys->rb.v[2] *= 1.0f - (ktimestep*k_walk_friction); + phys->rb.v[0] *= 1.0f - (VG_TIMESTEP_FIXED * k_walk_friction); + phys->rb.v[2] *= 1.0f - (VG_TIMESTEP_FIXED * k_walk_friction); } /* @@ -504,7 +504,7 @@ static void player_physics(void) float grabt = vg_get_axis( "grabr" )*0.5f+0.5f; phys->grab = vg_lerpf( phys->grab, grabt, 0.14f ); - player.pushing = 0.0f; + player.phys.pushing = 0.0f; if( !phys->in_air ) { @@ -522,8 +522,8 @@ static void player_physics(void) q_mul( correction, phys->rb.q, phys->rb.q ); } - v3_muladds( phys->rb.v, phys->rb.up, - -k_downforce*ktimestep, phys->rb.v ); + float const DOWNFORCE = -k_downforce*VG_TIMESTEP_FIXED; + v3_muladds( phys->rb.v, phys->rb.up, DOWNFORCE, phys->rb.v ); player_physics_control(); @@ -546,8 +546,9 @@ static void player_physics(void) v3_muladds( phys->rb.v, jumpdir, force, phys->rb.v ); phys->jump = 0.0f; - player.jump_time = vg_time; - + player.jump_time = vg.time; + + /* TODO: Move to audio file */ audio_lock(); audio_player_set_flags( &audio_player_extra, AUDIO_FLAG_SPACIAL_3D ); audio_player_set_position( &audio_player_extra, phys->rb.co ); @@ -563,8 +564,9 @@ static void player_physics(void) if( !phys->jump_charge ) { - phys->jump -= k_jump_charge_speed * ktimestep; + phys->jump -= k_jump_charge_speed * VG_TIMESTEP_FIXED; } + phys->jump_charge = 0; phys->jump = vg_clampf( phys->jump, 0.0f, 1.0f ); } @@ -587,6 +589,18 @@ static void player_do_motion(void) float horizontal = vg_get_axis("horizontal"), vertical = vg_get_axis("vertical"); + if( (phys->rb.co[1] < 0.0f) && !player.is_dead ) + { + audio_lock(); + audio_player_set_flags( &audio_player_extra, AUDIO_FLAG_SPACIAL_3D ); + audio_player_set_position( &audio_player_extra, phys->rb.co ); + audio_player_set_vol( &audio_player_extra, 20.0f ); + audio_player_playclip( &audio_player_extra, &audio_splash ); + audio_unlock(); + + player_kill(); + } + if( phys->on_board ) player_physics(); else @@ -596,8 +610,8 @@ static void player_do_motion(void) v3f prevco; v3_copy( phys->rb.co, prevco ); - apply_gravity( phys->rb.v, ktimestep ); - v3_muladds( phys->rb.co, phys->rb.v, ktimestep, phys->rb.co ); + apply_gravity( phys->rb.v, VG_TIMESTEP_FIXED ); + v3_muladds( phys->rb.co, phys->rb.v, VG_TIMESTEP_FIXED, phys->rb.co ); /* Real angular velocity integration */ v3_lerp( phys->rb.w, (v3f){0.0f,0.0f,0.0f}, 0.125f, phys->rb.w ); @@ -659,7 +673,7 @@ static void player_do_motion(void) player_save_frame(); audio_lock(); - audio_play_oneshot( &audio_gate_lap, 1.0f ); + audio_play_oneshot( &audio_gate_pass, 1.0f ); audio_unlock(); break; } @@ -680,21 +694,21 @@ static void player_mouseview(void) view_vel = { 0.0f, 0.0f }; if( vg_get_button_down( "primary" ) ) - v2_copy( vg_mouse, mouse_last ); + v2_copy( vg.mouse, mouse_last ); else if( vg_get_button( "primary" ) ) { v2f delta; - v2_sub( vg_mouse, mouse_last, delta ); - v2_copy( vg_mouse, mouse_last ); + v2_sub( vg.mouse, mouse_last, delta ); + v2_copy( vg.mouse, mouse_last ); - v2_muladds( view_vel, delta, 0.001f, view_vel ); + v2_muladds( view_vel, delta, 0.06f*vg.time_delta, view_vel ); } - v2_muladds( view_vel, - (v2f){ vg_get_axis("h1"), vg_get_axis("v1") }, - 0.05f, view_vel ); - v2_muls( view_vel, 0.93f, view_vel ); + v2_muladds( view_vel, (v2f){ vg_get_axis("h1"), vg_get_axis("v1") }, + 3.0f * vg.time_delta, view_vel ); + + v2_muls( view_vel, 1.0f-4.2f*vg.time_delta, view_vel ); v2_add( view_vel, player.angles, player.angles ); player.angles[1] = vg_clampf( player.angles[1], -VG_PIf*0.5f, VG_PIf*0.5f ); } @@ -712,13 +726,13 @@ static void player_freecam(void) static v3f move_vel = { 0.0f, 0.0f, 0.0f }; if( vg_get_button( "forward" ) ) - v3_muladds( move_vel, lookdir, ktimestep * movespeed, move_vel ); + v3_muladds( move_vel, lookdir, VG_TIMESTEP_FIXED * movespeed, move_vel ); if( vg_get_button( "back" ) ) - v3_muladds( move_vel, lookdir, ktimestep *-movespeed, move_vel ); + v3_muladds( move_vel, lookdir, VG_TIMESTEP_FIXED *-movespeed, move_vel ); if( vg_get_button( "left" ) ) - v3_muladds( move_vel, sidedir, ktimestep *-movespeed, move_vel ); + v3_muladds( move_vel, sidedir, VG_TIMESTEP_FIXED *-movespeed, move_vel ); if( vg_get_button( "right" ) ) - v3_muladds( move_vel, sidedir, ktimestep * movespeed, move_vel ); + v3_muladds( move_vel, sidedir, VG_TIMESTEP_FIXED * movespeed, move_vel ); v3_muls( move_vel, 0.7f, move_vel ); v3_add( move_vel, player.camera_pos, player.camera_pos );