X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vehicle.c;h=35004d6a81c08cbd323622a5bcce7c9ccf32e442;hb=b440efbe5785d114d08bb3f5ec0e09cad943006d;hp=3555a971ed35c140e15a63f252d243d13e7a6620;hpb=171b279a489f1b906265759b33249f61d48d3d5f;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/vehicle.c b/vehicle.c index 3555a97..35004d6 100644 --- a/vehicle.c +++ b/vehicle.c @@ -1,9 +1,14 @@ -#ifndef VEHICLE_C -#define VEHICLE_C - +#include "skaterift.h" #include "vehicle.h" +#include "scene_rigidbody.h" + +struct drivable_vehicle gzoomer = +{ + .rb.co = {-2000,-2000,-2000} +}; -static int spawn_car( int argc, const char *argv[] ){ +int spawn_car( int argc, const char *argv[] ) +{ v3f ra, rb, rx; v3_copy( skaterift.cam.pos, ra ); v3_muladds( ra, skaterift.cam.transform[2], -10.0f, rb ); @@ -30,7 +35,8 @@ static int spawn_car( int argc, const char *argv[] ){ return 0; } -static void vehicle_init(void){ +void vehicle_init(void) +{ q_identity( gzoomer.rb.q ); v3_zero( gzoomer.rb.w ); v3_zero( gzoomer.rb.v ); @@ -57,7 +63,8 @@ static void vehicle_init(void){ v3_copy((v3f){ 1.0f, -0.25f, 1.5f }, gzoomer.wheels_local[3] ); } -static void vehicle_wheel_force( int index ){ +void vehicle_wheel_force( int index ) +{ v3f pa, pb, n; m4x3_mulv( gzoomer.rb.to_world, gzoomer.wheels_local[index], pa ); v3_muladds( pa, gzoomer.rb.to_world[1], -k_car_spring_length, pb ); @@ -95,7 +102,7 @@ static void vehicle_wheel_force( int index ){ if( t < 1.0f ){ /* spring force */ - float Fv = (1.0f-t) * k_car_spring*k_rb_delta; + float Fv = (1.0f-t) * k_car_spring*vg.time_fixed_delta; v3f delta; v3_sub( pa, gzoomer.rb.co, delta ); @@ -104,7 +111,8 @@ static void vehicle_wheel_force( int index ){ v3_cross( gzoomer.rb.w, delta, rv ); v3_add( gzoomer.rb.v, rv, rv ); - Fv += v3_dot(rv, gzoomer.rb.to_world[1]) * -k_car_spring_damp*k_rb_delta; + Fv += v3_dot(rv, gzoomer.rb.to_world[1]) + * -k_car_spring_damp*vg.time_fixed_delta; /* scale by normal incident */ Fv *= v3_dot( n, gzoomer.rb.to_world[1] ); @@ -150,7 +158,8 @@ static void vehicle_wheel_force( int index ){ /* apply drive force */ if( index >= 2 ){ - v3_muls( ty, -gzoomer.drive * k_car_drive_force * k_rb_delta, F ); + v3_muls( ty, -gzoomer.drive * k_car_drive_force + * vg.time_fixed_delta, F ); rb_linear_impulse( &gzoomer.rb, raW, F ); } } @@ -161,7 +170,8 @@ static void vehicle_wheel_force( int index ){ } } -static void vehicle_solve_friction(void){ +void vehicle_solve_friction(void) +{ rigidbody *rb = &gzoomer.rb; for( int i=0; i<4; i++ ){ v3f raW; @@ -193,7 +203,7 @@ static void vehicle_solve_friction(void){ } } -static void vehicle_update_fixed(void) +void vehicle_update_fixed(void) { if( !gzoomer.alive ) return; @@ -211,8 +221,8 @@ static void vehicle_update_fixed(void) v3_muls( rb->to_world[1], -fabsf(v3_dot( rb->v, rb->to_world[2] )) * k_car_downforce, Fdown ); - v3_muladds( rb->v, Fair, k_rb_delta, rb->v ); - v3_muladds( rb->v, Fdown, k_rb_delta, rb->v ); + v3_muladds( rb->v, Fair, vg.time_fixed_delta, rb->v ); + v3_muladds( rb->v, Fdown, vg.time_fixed_delta, rb->v ); for( int i=0; i<4; i++ ) vehicle_wheel_force( i ); @@ -238,7 +248,7 @@ static void vehicle_update_fixed(void) } len = rb_manifold_apply_filtered( manifold, len ); - rb_presolve_contacts( manifold, len ); + rb_presolve_contacts( manifold, vg.time_fixed_delta, len ); for( int i=0; i<8; i++ ){ rb_solve_contacts( manifold, len ); vehicle_solve_friction(); @@ -248,7 +258,8 @@ static void vehicle_update_fixed(void) rb_update_matrices( rb ); } -static void vehicle_update_post(void){ +void vehicle_update_post(void) +{ if( !gzoomer.alive ) return; @@ -266,5 +277,3 @@ static void vehicle_update_post(void){ vg_line( p0, py, VG__GREEN ); } } - -#endif /* VEHICLE_H */