labs work
[vg.git] / vg.h
diff --git a/vg.h b/vg.h
index e62eb24dd9ecbd776dd3dac7753353e5e5f69a1f..119e9b1b162b54ebe4e24ddf7c9c63ded761c2f8 100644 (file)
--- a/vg.h
+++ b/vg.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2021-2023 Harry Godden (hgn) - All Rights Reserved */
+/* Copyright (C) 2021-2024 Mt.Zero Software - All Rights Reserved */
 
 /*
  
 |IMP| |   vg_render(void)
 |   | |      |
 |   | |      v
-|IMP| |   vg_ui(void)
+|IMP| |   vg_gui(void)
+|   | |      |
+|   | |      v
+|IMP| |   vg_game_settings_init(void)
+|IMP| |   vg_game_settings_gui( ui_rect panel ) 
+|   | |      |     (optional: #define VG_GAME_SETTINGS)
 |   | |      |
 |   |  '----'
 '___'
@@ -98,6 +103,12 @@ static void vg_post_update(void);
 static void vg_render(void);
 static void vg_gui(void);
 
+enum quality_profile{
+   k_quality_profile_high = 0,
+   k_quality_profile_low = 1,
+   k_quality_profile_min = 2
+};
+
 struct vg{
    /* Engine sync */
    SDL_Window     *window;
@@ -128,7 +139,11 @@ struct vg{
 
    int display_refresh_rate,
        fps_limit,
-       vsync;
+       vsync,
+       screen_mode,
+       display_index;
+
+   int settings_open;
 
    enum vsync_feature{
       k_vsync_feature_disabled=0,
@@ -138,7 +153,7 @@ struct vg{
    }
    vsync_feature;
 
-   double mouse_pos[2];
+   i32 mouse_pos[2];
    v2f mouse_delta,
        mouse_wheel;
 
@@ -152,6 +167,8 @@ struct vg{
           time_fixed_extrapolate,
           time_frame_delta;
 
+   f32 time_fixed_delta;
+
    u64 time_hp, time_hp_last, time_spinning;
 
    int fixed_iterations;
@@ -166,19 +183,20 @@ struct vg{
    engine_stage;
 
    /* graphics */
+#ifdef VG_3D
    m4x4f pv;
-   enum quality_profile{
-      k_quality_profile_high = 0,
-      k_quality_profile_low = 1,
-   }
-   quality_profile;
+#else
+   m3x3f pv;
+#endif
+
+   i32 quality_profile;
 
    float loader_ring;
    GLuint tex_missing;
 
    vg_rand rand;
 }
-static vg = { .time_rate = 1.0 };
+static vg = { .time_rate = 1.0, .time_fixed_delta = VG_TIMESTEP_FIXED };
 const char *vg_get_basepath(void){
    return vg.base_path;
 }
@@ -242,13 +260,15 @@ static void vg_checkgl( const char *src_info );
 #include "vg_input.h"
 #include "vg_imgui.h"
 #include "vg_lines.h"
+#include "vg_rigidbody_view.h"
 #include "vg_loader.h"
 #include "vg_opt.h"
+#include "vg_settings_menu.h"
 
 /* Diagnostic */
 static struct vg_profile vg_prof_update = {.name="update()"},
-                            vg_prof_render = {.name="render()"},
-                            vg_prof_swap   = {.name="swap"};
+                         vg_prof_render = {.name="render()"},
+                         vg_prof_swap   = {.name="swap"};
 
 static void vg_checkgl( const char *src_info )
 {
@@ -299,16 +319,18 @@ static void _vg_load_full( void *data ){
    /* internal */
    vg_loader_step( vg_input_init, vg_input_free );
    vg_loader_step( vg_lines_init, NULL );
+   vg_loader_step( vg_rb_view_init, NULL );
 #ifndef VG_NO_AUDIO
    vg_loader_step( vg_audio_init, vg_audio_free );
 #endif
    vg_loader_step( vg_profiler_init, NULL );
 
-   vg_async_call( async_internal_complete, NULL, 0 );
-
    /* client */
    vg_load();
 
+   vg_async_call( async_internal_complete, NULL, 0 );
+
+
    vg_success( "Client loaded in %fs\n", vg.time_real );
 }
 
@@ -396,8 +418,7 @@ static void _vg_process_events(void)
       }
    }
 
-   vg.mouse_pos[0] += vg.mouse_delta[0];
-   vg.mouse_pos[1] += vg.mouse_delta[1];
+   SDL_GetMouseState( &vg.mouse_pos[0], &vg.mouse_pos[1] );
 }
 
 static void _vg_gameloop_update(void)
@@ -411,21 +432,21 @@ static void _vg_gameloop_update(void)
    vg.engine_stage = k_engine_stage_update_fixed;
 
    vg.fixed_iterations = 0;
-   vg_lines.allow_input = 1;
+   vg_lines.enabled = vg_lines.render;
    vg.time_fixed_accumulator += vg.time_delta;
 
-   while( vg.time_fixed_accumulator >= VG_TIMESTEP_FIXED ){
+   while( vg.time_fixed_accumulator >= vg.time_fixed_delta ){
       vg_fixed_update();
-      vg_lines.allow_input = 0;
-      vg.time_fixed_accumulator -= VG_TIMESTEP_FIXED;
+      vg_lines.enabled = 0;
+      vg.time_fixed_accumulator -= vg.time_fixed_delta;
 
       vg.fixed_iterations ++;
       if( vg.fixed_iterations == 8 ){
          break;
       }
    }
-   vg_lines.allow_input = 1;
-   vg.time_fixed_extrapolate = vg.time_fixed_accumulator / VG_TIMESTEP_FIXED;
+   vg_lines.enabled = vg_lines.render;
+   vg.time_fixed_extrapolate = vg.time_fixed_accumulator / vg.time_fixed_delta;
 
    vg.engine_stage = k_engine_stage_update;
    vg_post_update();
@@ -440,6 +461,8 @@ static void _vg_gameloop_render(void)
    vg.engine_stage = k_engine_stage_rendering;
    vg_render();
 
+   vg_profile_end( &vg_prof_render );
+
    /* ui */
    vg.engine_stage = k_engine_stage_ui;
    {
@@ -453,21 +476,24 @@ static void _vg_gameloop_render(void)
       }
       else vg_gui();
 
+      if( vg.settings_open )
+         vg_settings_gui();
+
       /* vg tools */
 #ifndef VG_NO_AUDIO
       audio_debug_ui( vg.pv );
 #endif
 
                /* profiling */
-      int frame_target = vg.display_refresh_rate;
-      if( vg.fps_limit > 0 ) frame_target = vg.fps_limit;
-      vg_profile_drawn( 
-            (struct vg_profile *[]){
-               &vg_prof_update,&vg_prof_render,&vg_prof_swap}, 3,
-            (1.0f/(float)frame_target)*1000.0f, 
-            (ui_rect){ 4, 4, 250, 0 }, 0
-      );
       if( vg_profiler ){
+         int frame_target = vg.display_refresh_rate;
+         if( vg.fps_limit > 0 ) frame_target = vg.fps_limit;
+         vg_profile_drawn( 
+               (struct vg_profile *[]){
+                  &vg_prof_update,&vg_prof_render,&vg_prof_swap}, 3,
+               (1.0f/(float)frame_target)*1000.0f, 
+               (ui_rect){ 4, 4, 250, 0 }, 0, 0
+         );
          char perf[256];
          
          snprintf( perf, 255, 
@@ -486,12 +512,24 @@ static void _vg_gameloop_render(void)
                vg.time_fixed_extrapolate, vg.time_frame_delta,
                vg.time_spinning );
 
-         ui_text( (ui_rect){258, 4+24+12+12,900,900},perf,1,0,k_ui_align_left);
+         ui_text( (ui_rect){258,4,900,900},perf,1,0,k_ui_align_left);
       }
       ui_postrender();
    }
+}
 
-   vg_profile_end( &vg_prof_render );
+static void aaaaaaaaaaaaaaaaa( ui_rect r ){
+   int frame_target = vg.display_refresh_rate;
+   if( !vg.vsync ) frame_target = vg.fps_limit;
+
+   vg_profile_drawn( 
+         (struct vg_profile *[]){
+            &vg_prof_update,&vg_prof_render,&vg_prof_swap}, 3,
+         (1.0f/(f32)frame_target)*1500.0f, 
+         r,  1, 0
+   );
+
+   ui_fill( (ui_rect){ r[0], r[1] + (r[3]*2)/3, r[2], 1 }, ui_colour(k_ui_fg) );
 }
 
 static void vg_changevsync(void){
@@ -537,7 +575,7 @@ static void vg_changevsync(void){
 }
 
 static int vg_framefilter( double dt ){
-   if( vg.fps_limit < 25 ) vg.fps_limit = 25;
+   if( vg.fps_limit < 24 ) vg.fps_limit = 24;
    if( vg.fps_limit > 300 ) vg.fps_limit = 300;
 
    double min_frametime = 1.0/(double)vg.fps_limit;
@@ -606,11 +644,14 @@ static void _vg_gameloop(void){
 
       vg_changevsync();
 
-      vg_profile_begin( &vg_prof_swap );
+      enum engine_status status = _vg_engine_status();
+      if( status == k_engine_status_running )
+         vg_profile_begin( &vg_prof_swap );
+
       SDL_GL_SwapWindow( vg.window );
-      vg_profile_end( &vg_prof_swap );
 
-      enum engine_status status = _vg_engine_status();
+      if( status == k_engine_status_running )
+         vg_profile_end( &vg_prof_swap );
 
       vg.time_real += vg.time_frame_delta;
       vg.time_delta = vg.time_frame_delta * vg.time_rate;
@@ -730,10 +771,10 @@ static void _vg_init_window( const char *window_name )
    vg.window_x = video_mode.w;
    vg.window_y = video_mode.h;
 
-#ifdef VG_DEVWINDOW
-   vg.window_x = 1200;
-   vg.window_y = 880;
-#endif
+   if( vg.screen_mode == 2 ){
+      vg.window_x = 1280;
+      vg.window_y = 720;
+   }
 
 #ifndef _WIN32
        SDL_SetHint( "SDL_VIDEO_X11_XINERAMA", "1" );
@@ -741,40 +782,29 @@ static void _vg_init_window( const char *window_name )
        SDL_SetHint( "SDL_VIDEO_X11_XVIDMODE", "0" );
 #endif
 
-   vg_info( "CreateWindow( %d %d @%dhz )\n", vg.window_x, vg.window_y,
-                                             vg.display_refresh_rate );
+   u32 flags = SDL_WINDOW_OPENGL | SDL_WINDOW_INPUT_GRABBED |
+               SDL_WINDOW_RESIZABLE;
 
-   /* TODO: Allow selecting closest video mode from launch opts */
-   if((vg.window = SDL_CreateWindow( window_name,
+   if( vg.screen_mode == 1 )
+      flags |= SDL_WINDOW_FULLSCREEN;
+   else if( vg.screen_mode == 0 )
+      flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
 
-#ifdef VG_DEVWINDOW
-         0, 0, vg.window_x, vg.window_y, 
-         SDL_WINDOW_BORDERLESS|SDL_WINDOW_OPENGL|SDL_WINDOW_INPUT_GRABBED
-      ))){
-      SDL_SetWindowPosition( vg.window, video_mode.w-vg.window_x, 0 );
-   }
-#else
-                                     0, 0,
-                                     vg.window_x, vg.window_y,
+   vg_info( "CreateWindow( %d %d %u )\n", vg.window_x, vg.window_y, flags );
 
-                                     SDL_WINDOW_FULLSCREEN_DESKTOP | 
-                                     SDL_WINDOW_OPENGL |
-                                     SDL_WINDOW_INPUT_GRABBED 
-                                     )))
-   {
-      if( SDL_SetWindowDisplayMode( vg.window, &video_mode ) ){
-         vg_error( "SDL_SetWindowDisplayMode failed: %s", SDL_GetError() );
-         SDL_Quit();
-         exit(0);
-      }
+   if((vg.window = SDL_CreateWindow( window_name, 0, 0, 
+                                     vg.window_x, vg.window_y, flags ))){
+      if( vg.screen_mode == 2 )
+         SDL_SetWindowPosition( vg.window, video_mode.w-vg.window_x, 0 );
    }
-#endif
    else{
       vg_error( "SDL_CreateWindow failed: %s", SDL_GetError() );
       exit(0);
    }
 
    SDL_RaiseWindow( vg.window );
+   SDL_SetWindowMinimumSize( vg.window, 1280, 720 );
+   SDL_SetWindowMaximumSize( vg.window, 4096, 4096 );
 
    vg_info( "CreateContext\n" );
 
@@ -818,12 +848,7 @@ static void _vg_init_window( const char *window_name )
    }
 
    vg_info( "Display refresh rate: %d\n", dispmode.refresh_rate );
-   vg.fps_limit = vg.display_refresh_rate;
-
-#if defined(_WIN32) || defined(VG_DEVWINDOW)
-#else
-   //vg.vsync = 1;
-#endif
+   if( !vg.fps_limit) vg.fps_limit = vg.display_refresh_rate;
 }
 
 static void _vg_terminate(void)
@@ -852,8 +877,18 @@ static void vg_enter( int argc, char *argv[], const char *window_name ){
    vg_alloc_quota();
    _vg_console_init();
    
-   vg_console_reg_var( "fps_limit", &vg.fps_limit, k_var_dtype_i32, 0 );
-   vg_console_reg_var( "vsync", &vg.vsync, k_var_dtype_i32, VG_VAR_PERSISTENT );
+   vg_console_reg_var( "vg_fps_limit", &vg.fps_limit, 
+                        k_var_dtype_i32, VG_VAR_PERSISTENT );
+   vg_console_reg_var( "vg_vsync", &vg.vsync, 
+                        k_var_dtype_i32, VG_VAR_PERSISTENT );
+   vg_console_reg_var( "vg_quality", &vg.quality_profile, 
+                        k_var_dtype_i32, VG_VAR_PERSISTENT );
+   vg_console_reg_var( "vg_screen_mode", &vg.screen_mode,
+                        k_var_dtype_i32, VG_VAR_PERSISTENT );
+   vg_audio_register();
+   vg_console_load_autos();
+
+   vg_console_reg_cmd( "vg_settings", cmd_vg_settings_toggle, NULL );
    _vg_init_window( window_name );
 
    vg_async_init();
@@ -904,7 +939,7 @@ static void vg_fatal_error( const char *fmt, ... )
    va_start( args, fmt );
    _vg_logx_va( stderr, NULL, "fatal", KRED, fmt, args );
    va_end( args );
-   exit(0);
+   exit(1);
 }
 
 #endif /* VG_GAME */