From: hgn Date: Sun, 22 Jan 2023 19:09:13 +0000 (+0000) Subject: vehicle stuff X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=d45f2b7d71311ce5ce8cd3496844b4ec7d2f46ac;p=carveJwlIkooP6JGAAIwe30JlM.git vehicle stuff --- diff --git a/player.h b/player.h index f368c92..119b3f7 100644 --- a/player.h +++ b/player.h @@ -1,9 +1,5 @@ /* - * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved - */ - -/* - * TODO: Tilt camera down to face borde when its behind you or out of vision + * Copyright (C) 2021-2023 Mt.ZERO Software, Harry Godden - All Rights Reserved */ #ifndef PLAYER_H @@ -25,7 +21,6 @@ VG_STATIC float k_board_radius = 0.3f, k_board_length = 0.45f, k_board_allowance = 0.04f, - //k_friction_lat = 8.8f, k_friction_lat = 12.0f, k_friction_resistance = 0.01f, k_max_push_speed = 16.0f, @@ -358,27 +353,27 @@ VG_STATIC void player_init(void) /* 1 */ VG_VAR_F32_PERSISTENT( fc_speed ); /* TODO: NOT PERSISTENT */ - VG_VAR_F32_PERSISTENT( k_ragdoll_limit_scale ); - VG_VAR_I32_PERSISTENT( k_ragdoll_div ); - VG_VAR_I32_PERSISTENT( k_ragdoll_debug_collider ); - VG_VAR_I32_PERSISTENT( k_ragdoll_debug_constraints ); + VG_VAR_F32( k_ragdoll_limit_scale ); + VG_VAR_I32( k_ragdoll_div ); + VG_VAR_I32( k_ragdoll_debug_collider ); + VG_VAR_I32( k_ragdoll_debug_constraints ); - VG_VAR_F32_PERSISTENT( k_friction_lat ); + VG_VAR_F32( k_friction_lat ); - VG_VAR_F32_PERSISTENT( k_cog_spring ); - VG_VAR_F32_PERSISTENT( k_cog_damp ); + VG_VAR_F32( k_cog_spring ); + VG_VAR_F32( k_cog_damp ); - VG_VAR_F32_PERSISTENT( k_cog_mass_ratio ); - VG_VAR_F32_PERSISTENT( k_downforce ); + VG_VAR_F32( k_cog_mass_ratio ); + VG_VAR_F32( k_downforce ); - VG_VAR_F32_PERSISTENT( k_spring_force ); - VG_VAR_F32_PERSISTENT( k_spring_dampener ); - VG_VAR_F32_PERSISTENT( k_spring_angular ); + VG_VAR_F32( k_spring_force ); + VG_VAR_F32( k_spring_dampener ); + VG_VAR_F32( k_spring_angular ); - VG_VAR_F32_PERSISTENT( k_mmthrow_scale ); - VG_VAR_F32_PERSISTENT( k_mmcollect_lat ); - VG_VAR_F32_PERSISTENT( k_mmcollect_vert ); - VG_VAR_F32_PERSISTENT( k_mmdecay ); + VG_VAR_F32( k_mmthrow_scale ); + VG_VAR_F32( k_mmcollect_lat ); + VG_VAR_F32( k_mmcollect_vert ); + VG_VAR_F32( k_mmdecay ); vg_function_push( (struct vg_cmd){ .name = "reset", @@ -400,9 +395,6 @@ VG_STATIC void player_init(void) /* 1 */ sizeof(struct rewind_frame) * PLAYER_REWIND_FRAMES ); player_model_init(); - - /* controls */ - } VG_STATIC void player_save_rewind_frame(void) diff --git a/skaterift.c b/skaterift.c index 130bedf..272cff9 100644 --- a/skaterift.c +++ b/skaterift.c @@ -132,8 +132,10 @@ VG_STATIC void vg_update(void) { draw_origin_axis(); network_update(); + + if( !gzoomer.inside ) + player_update_pre(); - player_update_pre(); world_update( player.phys.rb.co ); } } @@ -142,7 +144,9 @@ VG_STATIC void vg_update_fixed(void) { if( vg.is_loaded ) { - player_update_fixed(); + if( !gzoomer.inside ) + player_update_fixed(); + vehicle_update_fixed(); } } @@ -151,7 +155,14 @@ VG_STATIC void vg_update_post(void) { if( vg.is_loaded ) { - player_update_post(); + if( gzoomer.inside ) + { + vehicle_camera(); + } + else + { + player_update_post(); + } menu_update(); vehicle_update_post(); } diff --git a/vehicle.h b/vehicle.h index a08871c..4caf21c 100644 --- a/vehicle.h +++ b/vehicle.h @@ -14,7 +14,8 @@ VG_STATIC float k_car_spring = 1.0f, k_car_friction_lat = 0.6f, k_car_friction_roll = 0.01f, k_car_drive_force = 1.0f, - k_car_air_resistance = 0.1f; + k_car_air_resistance = 0.1f, + k_car_downforce = 0.5f; VG_STATIC struct gvehicle { @@ -79,16 +80,19 @@ VG_STATIC void vehicle_init(void) VG_VAR_F32_PERSISTENT( k_car_friction_roll ); VG_VAR_F32_PERSISTENT( k_car_drive_force ); VG_VAR_F32_PERSISTENT( k_car_air_resistance ); + VG_VAR_F32_PERSISTENT( k_car_downforce ); + + VG_VAR_I32( gzoomer.inside ); vg_function_push( (struct vg_cmd){ .name = "spawn_car", .function = spawn_car }); - v3_copy((v3f){ -1.0f, -0.25f, -1.0f }, gzoomer.wheels_local[0] ); - v3_copy((v3f){ 1.0f, -0.25f, -1.0f }, gzoomer.wheels_local[1] ); - v3_copy((v3f){ -1.0f, -0.25f, 1.0f }, gzoomer.wheels_local[2] ); - v3_copy((v3f){ 1.0f, -0.25f, 1.0f }, gzoomer.wheels_local[3] ); + v3_copy((v3f){ -1.0f, -0.25f, -1.5f }, gzoomer.wheels_local[0] ); + v3_copy((v3f){ 1.0f, -0.25f, -1.5f }, gzoomer.wheels_local[1] ); + v3_copy((v3f){ -1.0f, -0.25f, 1.5f }, gzoomer.wheels_local[2] ); + v3_copy((v3f){ 1.0f, -0.25f, 1.5f }, gzoomer.wheels_local[3] ); } VG_STATIC void vehicle_wheel_force( int index ) @@ -237,7 +241,7 @@ VG_STATIC void vehicle_update_fixed(void) return; gzoomer.steer = vg_lerpf( gzoomer.steer, - player.input_walkh->axis.value * 0.2f, + player.input_walkh->axis.value * 0.4f, k_rb_delta * 8.0f ); gzoomer.drive = player.input_walkv->axis.value * k_car_drive_force; @@ -246,8 +250,14 @@ VG_STATIC void vehicle_update_fixed(void) sinf(gzoomer.steer), gzoomer.steerv ); /* apply air resistance */ - v3_muladds( gzoomer.rb.v, gzoomer.rb.v, - -k_car_air_resistance * k_rb_delta, gzoomer.rb.v ); + v3f Fair, Fdown; + + v3_muls( gzoomer.rb.v, -k_car_air_resistance, Fair ); + v3_muls( gzoomer.rb.up, -fabsf(v3_dot( gzoomer.rb.v, gzoomer.rb.forward )) * + k_car_downforce, Fdown ); + + v3_muladds( gzoomer.rb.v, Fair, k_rb_delta, gzoomer.rb.v ); + v3_muladds( gzoomer.rb.v, Fdown, k_rb_delta, gzoomer.rb.v ); for( int i=0; i<4; i++ ) vehicle_wheel_force( i ); @@ -298,4 +308,23 @@ VG_STATIC void vehicle_update_post(void) } } +VG_STATIC void vehicle_camera(void) +{ + float yaw = atan2f( gzoomer.rb.forward[0], -gzoomer.rb.forward[2] ), + pitch = atan2f + ( + -gzoomer.rb.forward[1], + sqrtf + ( + gzoomer.rb.forward[0]*gzoomer.rb.forward[0] + + gzoomer.rb.forward[2]*gzoomer.rb.forward[2] + ) + ); + + + main_camera.angles[0] = yaw; + main_camera.angles[1] = pitch; + v3_copy( gzoomer.rb.co, main_camera.pos ); +} + #endif /* VEHICLE_H */