seperation of body initialization, glider model
[carveJwlIkooP6JGAAIwe30JlM.git] / vehicle.c
index b367a1c785f68545ca1a62799c65a92add5dbc9e..3555a971ed35c140e15a63f252d243d13e7a6620 100644 (file)
--- a/vehicle.c
+++ b/vehicle.c
@@ -9,16 +9,16 @@ static int spawn_car( int argc, const char *argv[] ){
    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 +30,12 @@ static int spawn_car( int argc, const char *argv[] ){
    return 0;
 }
 
-static 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, 1.0f );
+static void vehicle_init(void){
+   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 +57,10 @@ 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 )
-{
+static 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 +87,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 );
@@ -100,22 +98,20 @@ static void vehicle_wheel_force( int index )
       float Fv = (1.0f-t) * k_car_spring*k_rb_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*k_rb_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 +120,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 +132,26 @@ 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 );
+         rb_linear_impulse( &gzoomer.rb, raW, F );
       }
    }
    else{
@@ -165,9 +161,8 @@ static void vehicle_wheel_force( int index )
    }
 }
 
-static void vehicle_solve_friction(void)
-{
-   rigidbody *rb = &gzoomer.obj.rb;
+static void vehicle_solve_friction(void){
+   rigidbody *rb = &gzoomer.rb;
    for( int i=0; i<4; i++ ){
       v3f raW;
       m3x3_mulv( rb->to_world, gzoomer.wheels_local[i], raW );
@@ -203,7 +198,7 @@ static 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], 
@@ -222,13 +217,17 @@ static void vehicle_update_fixed(void)
    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 );
 
@@ -246,15 +245,14 @@ static void vehicle_update_fixed(void)
    }
 
    rb_iter( rb );
-   rb_update_transform( rb );
+   rb_update_matrices( rb );
 }
 
-static void vehicle_update_post(void)
-{
+static 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;