getting stuff working on windows again
[vg.git] / vg.h
diff --git a/vg.h b/vg.h
index 2eb8e7a4e7bd2a7c39110e60980a7a6cf1dfa291..6aeadc9a0032a8c678d2a052bc750f134afae1e8 100644 (file)
--- a/vg.h
+++ b/vg.h
@@ -52,6 +52,8 @@
 #ifndef VG_HEADER_H
   #define VG_HEADER_H
 
+  const char *vg_get_basepath(void);
+
   #include "vg_platform.h"
   #include "vg_mem.h"
 
@@ -86,7 +88,7 @@ VG_STATIC void vg_print_backtrace(void)
   
   #ifdef VG_GAME
     #include "dep/glad/glad.h"
-    #include "submodules/SDL/include/SDL.h"
+    #include "dep/sdl/include/SDL.h"
     #include "vg_stdint.h"
     
     void vg_register_exit( void( *funcptr )(void), const char *name );
@@ -95,7 +97,6 @@ VG_STATIC void vg_print_backtrace(void)
     #include "vg_io.h"
     #include "vg_log.h"
     #include "vg_steam.h"
-    #include <setjmp.h>
 
   //#define VG_SYNC_DEBUG
   #ifdef VG_SYNC_DEBUG
@@ -122,24 +123,23 @@ VG_STATIC void vg_update_fixed(void);
 VG_STATIC void vg_update_post(void);
 
 VG_STATIC void vg_render(void);
-VG_STATIC void vg_ui(void);
+VG_STATIC void vg_gui(void);
 
-struct vg
-{
+struct vg{
    /* Engine sync */
    SDL_Window     *window;
    SDL_GLContext  gl_context;
+   const char     *base_path;
 
    SDL_sem *sem_loader;        /* allows only one loader at a time */
-
    jmp_buf env_loader_exit;
 
    SDL_threadID  thread_id_main,
                  thread_id_loader;
+   void         *thread_data;
 
    SDL_SpinLock sl_status;
-   enum engine_status
-   {
+   enum engine_status{
       k_engine_status_none,
       k_engine_status_load_internal,
       k_engine_status_running,
@@ -156,8 +156,7 @@ struct vg
    int display_refresh_rate,
        fps_limit;             /* 0: use vsync, >0: cap fps to this, no vsync */
 
-   enum vsync_feature
-   {
+   enum vsync_feature{
       k_vsync_feature_disabled=0,
       k_vsync_feature_enabled=1,
       k_vsync_feature_enabled_adaptive=2,
@@ -182,8 +181,7 @@ struct vg
 
    int fixed_iterations;
 
-   enum engine_stage
-   {
+   enum engine_stage{
       k_engine_stage_none,
       k_engine_stage_update,
       k_engine_stage_update_fixed,
@@ -194,8 +192,7 @@ struct vg
 
    /* graphics */
    m4x4f pv;
-   enum quality_profile
-   {
+   enum quality_profile{
       k_quality_profile_high = 0,
       k_quality_profile_low = 1,
    }
@@ -204,6 +201,9 @@ struct vg
    float loader_ring;
 }
 VG_STATIC vg = { .time_rate = 1.0 };
+const char *vg_get_basepath(void){
+   return vg.base_path;
+}
 
 enum vg_thread_purpose
 {
@@ -253,6 +253,7 @@ VG_STATIC void vg_checkgl( const char *src_info );
 #include "vg_tex.h"
 #include "vg_input.h"
 #include "vg_ui.h"
+#include "vg_imgui.h"
 #include "vg_lines.h"
 #include "vg_loader.h"
 #include "vg_opt.h"
@@ -303,7 +304,7 @@ void async_internal_complete( void *payload, u32 size )
    SDL_AtomicUnlock( &vg.sl_status );
 }
 
-VG_STATIC void _vg_load_full(void)
+VG_STATIC void _vg_load_full( void *data )
 {
    vg_preload();
 
@@ -324,11 +325,39 @@ VG_STATIC void _vg_process_events(void)
    v2_zero( vg.mouse_wheel );
    v2_zero( vg.mouse_delta );
 
+   /* Update input */
+   vg_process_inputs();
+
    /* SDL event loop */
    SDL_Event event;
    while( SDL_PollEvent( &event ) ){
       if( event.type == SDL_KEYDOWN ){
-         console_proc_key( event.key.keysym );
+         if( vg_console.enabled ){
+            if( event.key.keysym.sym == SDLK_ESCAPE ||
+                event.key.keysym.sym == SDLK_BACKQUOTE ){
+               vg_console.enabled = 0;
+               ui_defocus_all();
+            }
+            else if( (event.key.keysym.mod & KMOD_CTRL) && 
+                      event.key.keysym.sym == SDLK_n ){
+               _console_suggest_next();
+            }
+            else if( (event.key.keysym.mod & KMOD_CTRL ) &&
+                      event.key.keysym.sym == SDLK_p ){
+               _console_suggest_prev();
+            }
+            else{
+               _ui_proc_key( event.key.keysym );
+            }
+         }
+         else{
+            if( event.key.keysym.sym == SDLK_BACKQUOTE ){
+               vg_console.enabled = 1;
+            }
+            else {
+               _ui_proc_key( event.key.keysym );
+            }
+         }
       }
       else if( event.type == SDL_MOUSEWHEEL ){
          vg.mouse_wheel[0] += event.wheel.preciseX;
@@ -370,15 +399,12 @@ VG_STATIC void _vg_process_events(void)
          }
       }
       else if( event.type == SDL_TEXTINPUT ){
-         console_proc_utf8( event.text.text );
+         ui_proc_utf8( event.text.text );
       }
    }
 
    vg.mouse_pos[0] += vg.mouse_delta[0];
    vg.mouse_pos[1] += vg.mouse_delta[1];
-
-   /* Update input */
-   vg_process_inputs();
 }
 
 VG_STATIC void _vg_gameloop_update(void)
@@ -426,6 +452,21 @@ VG_STATIC void _vg_gameloop_render(void)
    /* ui */
    vg.engine_stage = k_engine_stage_ui;
    {
+      ui_prerender();
+      if( vg_console.enabled ){ 
+         vg_ui.ignore_input_frames = 10;
+         vg_gui();
+         vg_ui.ignore_input_frames = 0;
+         vg_ui.wants_mouse = 1;
+         _vg_console_draw();
+      }
+      else vg_gui();
+
+      /* vg tools */
+      audio_debug_ui( vg.pv );
+
+      ui_postrender();
+#if 0
       ui_begin( vg.window_x, vg.window_y );
 
       /* TODO */
@@ -471,12 +512,11 @@ VG_STATIC void _vg_gameloop_render(void)
       }
 
       /* FIXME */
-      audio_debug_ui( vg.pv );
-      vg_ui();
-      _vg_console_draw();
+      vg_gui();
       
       ui_resolve();
       ui_draw( NULL );
+#endif
    }
 
    vg_profile_end( &vg_prof_render );
@@ -670,6 +710,15 @@ VG_STATIC void _vg_init_window( const char *window_name )
    SDL_InitSubSystem( SDL_INIT_AUDIO );
    SDL_InitSubSystem( SDL_INIT_GAMECONTROLLER );
 
+   char *exe_basepath = SDL_GetBasePath();
+   u32 len = vg_align8( strlen(exe_basepath)+1 );
+   char *dest  = vg_linear_alloc( vg_mem.rtmemory, len );
+   strcpy( dest, exe_basepath );
+   SDL_free( exe_basepath );
+   vg.base_path = dest;
+
+   vg_info( "Basepath: %s\n", vg.base_path );
+
    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
    SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3 );
    SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 3 );
@@ -751,6 +800,9 @@ VG_STATIC void _vg_init_window( const char *window_name )
 
    vg_info( "CreateContext\n" );
 
+   /* ????? */
+   if( SDL_IsTextInputActive() ) SDL_StopTextInput();
+
    /* 
     * OpenGL loading 
     */
@@ -789,11 +841,9 @@ VG_STATIC void _vg_init_window( const char *window_name )
 
    vg_info( "Display refresh rate: %d\n", dispmode.refresh_rate );
 
-#ifdef _WIN32
+#if defined(_WIN32) || defined(VG_DEVWINDOW)
    vg.fps_limit = vg.display_refresh_rate;
 #else
-   /* request vsync by default on linux to avoid screen tearing.
-    * this does have its own issues with compositing on X11. */
    vg.fps_limit = 0;
 #endif
 }
@@ -818,6 +868,7 @@ VG_STATIC void _vg_terminate(void)
 
 VG_STATIC void vg_enter( int argc, char *argv[], const char *window_name )
 {
+   vg_rand_seed( 461 );
    _vg_process_launch_opts_internal( argc, argv );
 
    /* Systems init */
@@ -828,8 +879,8 @@ VG_STATIC void vg_enter( int argc, char *argv[], const char *window_name )
    _vg_init_window( window_name );
 
    vg_async_init();
-   
    SDL_SetRelativeMouseMode(1);
+
    vg.thread_id_main = SDL_GetThreadID(NULL);
    
    /* Opengl-required systems */
@@ -839,7 +890,7 @@ VG_STATIC void vg_enter( int argc, char *argv[], const char *window_name )
    vg.engine_status = k_engine_status_load_internal;
 
    _vg_opengl_sync_init();
-    vg_loader_start( _vg_load_full );
+    vg_loader_start( _vg_load_full, NULL );
    _vg_gameloop();
    _vg_terminate();
 }