X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vehicle.h;h=06c8be1f9d1301be106921f670931e6ef4c21c54;hb=2673c575386c604fc2c0603dba2480eda05cf97a;hp=a08871c2e3f116eff1f9a936b79b5ffa29bb9fca;hpb=6c1541ad6a2915912e7439661820a786cb145af4;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/vehicle.h b/vehicle.h index a08871c..06c8be1 100644 --- a/vehicle.h +++ b/vehicle.h @@ -1,3 +1,5 @@ + +#define VEHICLE_H #ifndef VEHICLE_H #define VEHICLE_H @@ -14,7 +16,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 +82,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 +243,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 +252,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 ); @@ -282,7 +294,7 @@ VG_STATIC void vehicle_update_post(void) return; rb_debug( &gzoomer.rb, VG__WHITE ); - vg_line( player.phys.rb.co, gzoomer.rb.co, VG__WHITE ); + vg_line( player.rb.co, gzoomer.rb.co, VG__WHITE ); /* draw friction vectors */ v3f p0, px, py; @@ -298,4 +310,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 */