X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vehicle.c;h=35004d6a81c08cbd323622a5bcce7c9ccf32e442;hb=b440efbe5785d114d08bb3f5ec0e09cad943006d;hp=3d68d1152793b2fbaeb29bf48460e12df055d78b;hpb=22f62f001f21d1b91fefd9fc495c122d9ddf205a;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/vehicle.c b/vehicle.c index 3d68d11..35004d6 100644 --- a/vehicle.c +++ b/vehicle.c @@ -1,24 +1,29 @@ -#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 ); float t; - if( spherecast_world( world_current_instance(), ra, rb, - gzoomer.obj.inf.sphere.radius, &t, rx, 0 ) != -1 ) + if( spherecast_world( world_current_instance(), + ra, rb, 1.0f, &t, rx, 0 ) != -1 ) { - v3_lerp( ra, rb, t, gzoomer.obj.rb.co ); - gzoomer.obj.rb.co[1] += 4.0f; - q_axis_angle( gzoomer.obj.rb.q, (v3f){1.0f,0.0f,0.0f}, 0.001f ); - v3_zero( gzoomer.obj.rb.v ); - v3_zero( gzoomer.obj.rb.w ); + v3_lerp( ra, rb, t, gzoomer.rb.co ); + gzoomer.rb.co[1] += 4.0f; + q_axis_angle( gzoomer.rb.q, (v3f){1.0f,0.0f,0.0f}, 0.001f ); + v3_zero( gzoomer.rb.v ); + v3_zero( gzoomer.rb.w ); - rb_update_transform( &gzoomer.obj.rb ); + rb_update_matrices( &gzoomer.rb ); gzoomer.alive = 1; vg_success( "Spawned car\n" ); @@ -30,13 +35,13 @@ static int spawn_car( int argc, const char *argv[] ){ return 0; } -static void vehicle_init(void) +void vehicle_init(void) { - q_identity( gzoomer.obj.rb.q ); - v3_zero( gzoomer.obj.rb.w ); - v3_zero( gzoomer.obj.rb.v ); - v3_zero( gzoomer.obj.rb.co ); - rb_init_object( &gzoomer.obj ); + q_identity( gzoomer.rb.q ); + v3_zero( gzoomer.rb.w ); + v3_zero( gzoomer.rb.v ); + v3_zero( gzoomer.rb.co ); + rb_setbody_sphere( &gzoomer.rb, 1.0f, 8.0f, 1.0f ); VG_VAR_F32( k_car_spring, flags=VG_VAR_PERSISTENT ); VG_VAR_F32( k_car_spring_damp, flags=VG_VAR_PERSISTENT ); @@ -58,11 +63,11 @@ 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.obj.rb.to_world, gzoomer.wheels_local[index], pa ); - v3_muladds( pa, gzoomer.obj.rb.to_world[1], -k_car_spring_length, pb ); + m4x3_mulv( gzoomer.rb.to_world, gzoomer.wheels_local[index], pa ); + v3_muladds( pa, gzoomer.rb.to_world[1], -k_car_spring_length, pb ); #if 1 @@ -89,7 +94,7 @@ static void vehicle_wheel_force( int index ) v3_lerp( pa, pb, t, pc ); m4x3f mtx; - m3x3_copy( gzoomer.obj.rb.to_world, mtx ); + m3x3_copy( gzoomer.rb.to_world, mtx ); v3_copy( pc, mtx[3] ); vg_line_sphere( mtx, k_car_wheel_radius, VG__BLACK ); vg_line( pa, pc, VG__WHITE ); @@ -97,25 +102,24 @@ 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.obj.rb.co, delta ); + v3_sub( pa, gzoomer.rb.co, delta ); v3f rv; - v3_cross( gzoomer.obj.rb.w, delta, rv ); - v3_add( gzoomer.obj.rb.v, rv, rv ); + v3_cross( gzoomer.rb.w, delta, rv ); + v3_add( gzoomer.rb.v, rv, rv ); - Fv += v3_dot( rv, gzoomer.obj.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.obj.rb.to_world[1] ); + Fv *= v3_dot( n, gzoomer.rb.to_world[1] ); v3f F; - v3_muls( gzoomer.obj.rb.to_world[1], Fv, F ); - - rb_linear_impulse( &gzoomer.obj.rb, delta, F ); + v3_muls( gzoomer.rb.to_world[1], Fv, F ); + rb_linear_impulse( &gzoomer.rb, delta, F ); /* friction vectors * -------------------------------------------------------------*/ @@ -124,7 +128,7 @@ static void vehicle_wheel_force( int index ) if( index <= 1 ) v3_cross( gzoomer.steerv, n, tx ); else - v3_cross( n, gzoomer.obj.rb.to_world[2], tx ); + v3_cross( n, gzoomer.rb.to_world[2], tx ); v3_cross( tx, n, ty ); v3_copy( tx, gzoomer.tangent_vectors[ index ][0] ); @@ -136,26 +140,27 @@ static void vehicle_wheel_force( int index ) /* orient inverse inertia tensors */ v3f raW; - m3x3_mulv( gzoomer.obj.rb.to_world, gzoomer.wheels_local[index], raW ); + m3x3_mulv( gzoomer.rb.to_world, gzoomer.wheels_local[index], raW ); v3f raCtx, raCtxI, raCty, raCtyI; v3_cross( tx, raW, raCtx ); v3_cross( ty, raW, raCty ); - m3x3_mulv( gzoomer.obj.rb.iIw, raCtx, raCtxI ); - m3x3_mulv( gzoomer.obj.rb.iIw, raCty, raCtyI ); + m3x3_mulv( gzoomer.rb.iIw, raCtx, raCtxI ); + m3x3_mulv( gzoomer.rb.iIw, raCty, raCtyI ); - gzoomer.tangent_mass[index][0] = gzoomer.obj.rb.inv_mass; + gzoomer.tangent_mass[index][0] = gzoomer.rb.inv_mass; gzoomer.tangent_mass[index][0] += v3_dot( raCtx, raCtxI ); gzoomer.tangent_mass[index][0] = 1.0f/gzoomer.tangent_mass[index][0]; - gzoomer.tangent_mass[index][1] = gzoomer.obj.rb.inv_mass; + gzoomer.tangent_mass[index][1] = gzoomer.rb.inv_mass; gzoomer.tangent_mass[index][1] += v3_dot( raCty, raCtyI ); gzoomer.tangent_mass[index][1] = 1.0f/gzoomer.tangent_mass[index][1]; /* apply drive force */ if( index >= 2 ){ - v3_muls( ty, -gzoomer.drive * k_car_drive_force * k_rb_delta, F ); - rb_linear_impulse( &gzoomer.obj.rb, raW, F ); + v3_muls( ty, -gzoomer.drive * k_car_drive_force + * vg.time_fixed_delta, F ); + rb_linear_impulse( &gzoomer.rb, raW, F ); } } else{ @@ -165,9 +170,9 @@ static void vehicle_wheel_force( int index ) } } -static void vehicle_solve_friction(void) +void vehicle_solve_friction(void) { - rigidbody *rb = &gzoomer.obj.rb; + rigidbody *rb = &gzoomer.rb; for( int i=0; i<4; i++ ){ v3f raW; m3x3_mulv( rb->to_world, gzoomer.wheels_local[i], raW ); @@ -198,12 +203,12 @@ static void vehicle_solve_friction(void) } } -static void vehicle_update_fixed(void) +void vehicle_update_fixed(void) { if( !gzoomer.alive ) return; - rigidbody *rb = &gzoomer.obj.rb; + rigidbody *rb = &gzoomer.rb; v3_muls( rb->to_world[2], -cosf(gzoomer.steer), gzoomer.steerv ); v3_muladds( gzoomer.steerv, rb->to_world[0], @@ -216,19 +221,23 @@ 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 ); + rigidbody _null = {0}; + _null.inv_mass = 0.0f; + m3x3_zero( _null.iI ); + rb_ct manifold[64]; - int len = rb_sphere__scene( rb->to_world, &gzoomer.obj.inf.sphere, NULL, - &world_current_instance()->rb_geo.inf.scene, + int len = rb_sphere__scene( rb->to_world, 1.0f, NULL, + world_current_instance()->geo_bh, manifold, 0 ); for( int j=0; jrb_geo.rb; + manifold[j].rbb = &_null; } rb_manifold_filter_coplanar( manifold, len, 0.05f ); @@ -239,22 +248,22 @@ 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(); } rb_iter( rb ); - rb_update_transform( rb ); + rb_update_matrices( rb ); } -static void vehicle_update_post(void) +void vehicle_update_post(void) { if( !gzoomer.alive ) return; - rb_object_debug( &gzoomer.obj, VG__WHITE ); + vg_line_sphere( gzoomer.rb.to_world, 1.0f, VG__WHITE ); /* draw friction vectors */ v3f p0, px, py; @@ -268,5 +277,3 @@ static void vehicle_update_post(void) vg_line( p0, py, VG__GREEN ); } } - -#endif /* VEHICLE_H */