#ifndef VG_HEADER_H
#define VG_HEADER_H
+ const char *vg_get_basepath(void);
+
#include "vg_platform.h"
#include "vg_mem.h"
#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 );
#include "vg_io.h"
#include "vg_log.h"
#include "vg_steam.h"
- #include <setjmp.h>
//#define VG_SYNC_DEBUG
#ifdef VG_SYNC_DEBUG
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,
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,
int fixed_iterations;
- enum engine_stage
- {
+ enum engine_stage{
k_engine_stage_none,
k_engine_stage_update,
k_engine_stage_update_fixed,
/* graphics */
m4x4f pv;
- enum quality_profile
- {
+ enum quality_profile{
k_quality_profile_high = 0,
k_quality_profile_low = 1,
}
quality_profile;
+
+ float loader_ring;
}
VG_STATIC vg = { .time_rate = 1.0 };
+const char *vg_get_basepath(void){
+ return vg.base_path;
+}
enum vg_thread_purpose
{
#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"
SDL_AtomicUnlock( &vg.sl_status );
}
-VG_STATIC void _vg_load_full(void)
+VG_STATIC void _vg_load_full( void *data )
{
vg_preload();
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;
vg.mouse_wheel[1] += event.wheel.preciseY;
}
+ else if( event.type == SDL_CONTROLLERDEVICEADDED ||
+ event.type == SDL_CONTROLLERDEVICEREMOVED )
+ {
+ vg_input_device_event( &event );
+ }
else if( event.type == SDL_CONTROLLERAXISMOTION ||
event.type == SDL_CONTROLLERBUTTONDOWN ||
- event.type == SDL_CONTROLLERBUTTONUP ||
- event.type == SDL_CONTROLLERDEVICEADDED ||
- event.type == SDL_CONTROLLERDEVICEREMOVED
- )
+ event.type == SDL_CONTROLLERBUTTONUP )
{
vg_input_controller_event( &event );
}
}
}
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_update_inputs();
}
VG_STATIC void _vg_gameloop_update(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 */
}
/* 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 );
VG_STATIC int _vg_crashscreen(void)
{
- if( vg.window_should_close )
- return 1;
-
+#if 0
if( vg_getkey( SDLK_ESCAPE ) )
return 1;
+#endif
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
glEnable(GL_BLEND);
enum engine_status status = _vg_engine_status();
+ vg.time_delta = vg.time_frame_delta * vg.time_rate;
+ vg.time += vg.time_delta;
+
+ vg_run_async_checked();
+ _vg_process_events();
+
+ if( vg.window_should_close )
+ break;
+
if( status == k_engine_status_crashed ){
if( _vg_crashscreen() )
break;
}
else{
- vg.time_delta = vg.time_frame_delta * vg.time_rate;
- vg.time += vg.time_delta;
-
- vg_run_async_checked();
- _vg_process_events();
-
- if( vg.window_should_close )
- break;
-
if( status == k_engine_status_running ){
_vg_gameloop_update();
_vg_gameloop_render();
}
}
+ if( vg.loader_ring > 0.01f ){
+ vg.loader_ring -= vg.time_frame_delta * 0.5f;
+ _vg_loader_render_ring( vg.loader_ring );
+ }
+
vg.time_frame_delta = 0.0;
vg.time_spinning = 0;
}
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 );
vg_info( "CreateContext\n" );
+ /* ????? */
+ if( SDL_IsTextInputActive() ) SDL_StopTextInput();
+
/*
* OpenGL loading
*/
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
}
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 */
_vg_init_window( window_name );
vg_async_init();
-
SDL_SetRelativeMouseMode(1);
+
vg.thread_id_main = SDL_GetThreadID(NULL);
/* Opengl-required systems */
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();
}