-#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" );
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 );
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
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 );
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
* -------------------------------------------------------------*/
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] );
/* 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{
}
}
-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 );
}
}
-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],
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; j<len; j++ ){
manifold[j].rba = rb;
- manifold[j].rbb = &world_current_instance()->rb_geo.rb;
+ manifold[j].rbb = &_null;
}
rb_manifold_filter_coplanar( manifold, len, 0.05f );
}
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;
vg_line( p0, py, VG__GREEN );
}
}
-
-#endif /* VEHICLE_H */