basic npc
[carveJwlIkooP6JGAAIwe30JlM.git] / vehicle.c
index 3555a971ed35c140e15a63f252d243d13e7a6620..35004d6a81c08cbd323622a5bcce7c9ccf32e442 100644 (file)
--- 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 */