physics revision
[carveJwlIkooP6JGAAIwe30JlM.git] / main.c
diff --git a/main.c b/main.c
index aa90b02bdc25d39d127155a874fc9971d668ff51..8b2f5615193d5eb146719b4993bddc2c5ca16237 100644 (file)
--- a/main.c
+++ b/main.c
@@ -17,6 +17,7 @@ vg_tex2d tex_water = { .path = "textures/water.qoi" };
 static int debugview = 0;
 static int sv_debugcam = 0;
 static int lightedit = 0;
+static int sv_scene = 1;
 
 /* Components */
 #include "road.h"
@@ -37,6 +38,10 @@ static int lightedit = 0;
 #include "shaders/standard.h"
 #include "shaders/unlit.h"
 
+#ifndef VG_RELEASE
+#include "physics_test.h"
+#endif
+
 void vg_register(void)
 {
    shader_blit_register();
@@ -72,7 +77,7 @@ vg_tex2d *texture_list[] =
 
 int main( int argc, char *argv[] )
 { 
-   vg_init( argc, argv, "Voyager Game Engine" ); 
+   vg_init( argc, argv, "CARBE" ); 
 }
 
 static int playermodel( int argc, char const *argv[] )
@@ -90,7 +95,15 @@ static int playermodel( int argc, char const *argv[] )
 void vg_start(void)
 {
    vg_convar_push( (struct vg_convar){
-      .name = "freecam",
+      .name = "scene",
+      .data = &sv_scene,
+      .data_type = k_convar_dtype_i32,
+      .opt_i32 = { .min=0, .max=1, .clamp=1 },
+      .persistent = 1
+   });
+
+   vg_convar_push( (struct vg_convar){
+      .name = "fc",
       .data = &freecam,
       .data_type = k_convar_dtype_i32,
       .opt_i32 = { .min=0, .max=1, .clamp=1 },
@@ -121,6 +134,14 @@ void vg_start(void)
       .persistent = 1
    });
 
+   vg_convar_push( (struct vg_convar){
+      .name = "dt",
+      .data = &ktimestep,
+      .data_type = k_convar_dtype_f32,
+      .opt_f32 = { .clamp = 0 },
+      .persistent = 0
+   });
+
    vg_convar_push( (struct vg_convar){
       .name = "debugcam",
       .data = &sv_debugcam,
@@ -146,13 +167,26 @@ void vg_start(void)
    
    init_other();
 
-   character_load( &player.mdl, "ch_mike" );
-   character_init_ragdoll( &player.mdl );
+   /* 
+    * If we're in physics test mode we dont need to load anything else, this
+    * parameter is dev only. TODO: dev only cvars that don't ship with the game
+    * when building in release mode.
+    */
+
+   if( sv_scene == 0 )
+   {
+      character_load( &player.mdl, "ch_default" );
+      character_init_ragdoll( &player.mdl );
 
-   world_load();
+      world_load();
 
-   reset_player( 1, (const char *[]){ "tutorial" } );
-   player_transform_update();
+      reset_player( 1, (const char *[]){ "start" } );
+      rb_init( &player.rb );
+   }
+   else
+   {
+      physics_test_start();
+   }
 }
 
 void vg_free(void)
@@ -162,7 +196,22 @@ void vg_free(void)
 
 void vg_update(void)
 {
-   player_update();
+   if( sv_scene == 0 )
+   {
+      player_update();
+      world_update();
+      //traffic_visualize( world.traffic, world.traffic_count );
+      //
+      /* TEMP */
+      if( glfwGetKey( vg_window, GLFW_KEY_J ))
+      {
+         v3_copy( player.camera_pos, world.mr_ball.co );
+      }
+   }
+   else if( sv_scene == 1 )
+   {
+      physics_test_update();
+   }
 }
 
 static void vg_framebuffer_resize( int w, int h )
@@ -172,16 +221,16 @@ static void vg_framebuffer_resize( int w, int h )
    water_fb_resize();
 }
 
-void vg_render(void) 
+static void draw_origin_axis(void)
 {
-   glBindFramebuffer( GL_FRAMEBUFFER, 0 );
-   glViewport( 0,0, vg_window_x, vg_window_y );
-
-   glDisable( GL_DEPTH_TEST );
-   glClearColor( 0.11f, 0.35f, 0.37f, 1.0f );
-   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
+   vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 1.0f, 0.0f, 0.0f }, 0xffff0000 );
+   vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 0.0f, 1.0f, 0.0f }, 0xff00ff00 );
+   vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 0.0f, 0.0f, 1.0f }, 0xff0000ff );
+}
 
-   float speed = freecam? 0.0f: v3_length( player.v );
+static void render_main_game(void)
+{
+   float speed = freecam? 0.0f: v3_length( player.rb.v );
    v3f shake = { vg_randf()-0.5f, vg_randf()-0.5f, vg_randf()-0.5f };
    v3_muls( shake, speed*0.01f, shake );
 
@@ -195,10 +244,6 @@ void vg_render(void)
 
    m4x4_mul( vg_pv, world_4x4, vg_pv );
 
-   vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 1.0f, 0.0f, 0.0f }, 0xffff0000 );
-   vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 0.0f, 1.0f, 0.0f }, 0xff00ff00 );
-   vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 0.0f, 0.0f, 1.0f }, 0xff0000ff );
-
    glEnable( GL_DEPTH_TEST );
    
    /* 
@@ -269,6 +314,27 @@ void vg_render(void)
    glViewport( 0,0, vg_window_x, vg_window_y );
 }
 
+void vg_render(void) 
+{
+   glBindFramebuffer( GL_FRAMEBUFFER, 0 );
+   glViewport( 0,0, vg_window_x, vg_window_y );
+
+   glDisable( GL_DEPTH_TEST );
+   glClearColor( 0.11f, 0.35f, 0.37f, 1.0f );
+   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
+
+   draw_origin_axis();
+
+   if( sv_scene == 0 )
+   {
+      render_main_game();
+   }
+   else if( sv_scene == 1 )
+   {
+      physics_test_render();
+   }
+}
+
 static void run_light_widget( struct light_widget *lw )
 {
    struct ui_checkbox c1 = { .data=&lw->enabled };