+
+#define VEHICLE_H
#ifndef VEHICLE_H
#define VEHICLE_H
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
{
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 )
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;
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 );
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;
}
}
+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 */