plish
[carveJwlIkooP6JGAAIwe30JlM.git] / vehicle.h
index a08871c2e3f116eff1f9a936b79b5ffa29bb9fca..06c8be1f9d1301be106921f670931e6ef4c21c54 100644 (file)
--- a/vehicle.h
+++ b/vehicle.h
@@ -1,3 +1,5 @@
+
+#define VEHICLE_H
 #ifndef VEHICLE_H
 #define VEHICLE_H
 
@@ -14,7 +16,8 @@ VG_STATIC float k_car_spring = 1.0f,
                 k_car_friction_lat = 0.6f,
                 k_car_friction_roll = 0.01f,
                 k_car_drive_force = 1.0f,
-                k_car_air_resistance = 0.1f;
+                k_car_air_resistance = 0.1f,
+                k_car_downforce      = 0.5f;
 
 VG_STATIC struct gvehicle
 {
@@ -79,16 +82,19 @@ VG_STATIC void vehicle_init(void)
    VG_VAR_F32_PERSISTENT( k_car_friction_roll );
    VG_VAR_F32_PERSISTENT( k_car_drive_force );
    VG_VAR_F32_PERSISTENT( k_car_air_resistance );
+   VG_VAR_F32_PERSISTENT( k_car_downforce );
+
+   VG_VAR_I32( gzoomer.inside );
 
        vg_function_push( (struct vg_cmd){
                .name = "spawn_car",
                .function = spawn_car
        });
 
-   v3_copy((v3f){ -1.0f, -0.25f, -1.0f }, gzoomer.wheels_local[0] );
-   v3_copy((v3f){  1.0f, -0.25f, -1.0f }, gzoomer.wheels_local[1] );
-   v3_copy((v3f){ -1.0f, -0.25f,  1.0f }, gzoomer.wheels_local[2] );
-   v3_copy((v3f){  1.0f, -0.25f,  1.0f }, gzoomer.wheels_local[3] );
+   v3_copy((v3f){ -1.0f, -0.25f, -1.5f }, gzoomer.wheels_local[0] );
+   v3_copy((v3f){  1.0f, -0.25f, -1.5f }, gzoomer.wheels_local[1] );
+   v3_copy((v3f){ -1.0f, -0.25f,  1.5f }, gzoomer.wheels_local[2] );
+   v3_copy((v3f){  1.0f, -0.25f,  1.5f }, gzoomer.wheels_local[3] );
 }
 
 VG_STATIC void vehicle_wheel_force( int index )
@@ -237,7 +243,7 @@ VG_STATIC void vehicle_update_fixed(void)
       return;
 
    gzoomer.steer = vg_lerpf( gzoomer.steer, 
-                             player.input_walkh->axis.value * 0.2f,
+                             player.input_walkh->axis.value * 0.4f,
                              k_rb_delta * 8.0f );
 
    gzoomer.drive = player.input_walkv->axis.value * k_car_drive_force;
@@ -246,8 +252,14 @@ VG_STATIC void vehicle_update_fixed(void)
                sinf(gzoomer.steer), gzoomer.steerv );
 
    /* apply air resistance */
-   v3_muladds( gzoomer.rb.v, gzoomer.rb.v, 
-               -k_car_air_resistance * k_rb_delta, gzoomer.rb.v );
+   v3f Fair, Fdown;
+
+   v3_muls( gzoomer.rb.v, -k_car_air_resistance, Fair );
+   v3_muls( gzoomer.rb.up, -fabsf(v3_dot( gzoomer.rb.v, gzoomer.rb.forward )) *
+                                 k_car_downforce, Fdown );
+
+   v3_muladds( gzoomer.rb.v, Fair,  k_rb_delta, gzoomer.rb.v );
+   v3_muladds( gzoomer.rb.v, Fdown, k_rb_delta, gzoomer.rb.v );
    
    for( int i=0; i<4; i++ )
       vehicle_wheel_force( i );
@@ -282,7 +294,7 @@ VG_STATIC void vehicle_update_post(void)
       return;
 
    rb_debug( &gzoomer.rb, VG__WHITE );
-   vg_line( player.phys.rb.co, gzoomer.rb.co, VG__WHITE );
+   vg_line( player.rb.co, gzoomer.rb.co, VG__WHITE );
 
    /* draw friction vectors */
    v3f p0, px, py;
@@ -298,4 +310,23 @@ VG_STATIC void vehicle_update_post(void)
    }
 }
 
+VG_STATIC void vehicle_camera(void)
+{
+   float yaw = atan2f( gzoomer.rb.forward[0], -gzoomer.rb.forward[2] ),
+       pitch = atan2f
+               ( 
+                   -gzoomer.rb.forward[1], 
+                   sqrtf
+                   (
+                     gzoomer.rb.forward[0]*gzoomer.rb.forward[0] + 
+                     gzoomer.rb.forward[2]*gzoomer.rb.forward[2]
+                   )
+               );
+               
+
+   main_camera.angles[0] = yaw;
+   main_camera.angles[1] = pitch;
+   v3_copy( gzoomer.rb.co, main_camera.pos );
+}
+
 #endif /* VEHICLE_H */