VG_STATIC void vg_render(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,
}
SDL_AtomicUnlock( &vg.sl_status );
}
-VG_STATIC void _vg_load_full(void)
+VG_STATIC void _vg_load_full( void *data )
{
vg_preload();
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;
}
}
else if( event.type == SDL_TEXTINPUT ){
- console_proc_utf8( event.text.text );
+ ui_proc_utf8( event.text.text );
}
}
vg.engine_stage = k_engine_stage_ui;
{
ui_prerender();
- vg_gui();
+ 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 );
}
/* FIXME */
- audio_debug_ui( vg.pv );
vg_gui();
- _vg_console_draw();
ui_resolve();
ui_draw( NULL );
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 );
#ifdef VG_DEVWINDOW
0, 0, vg.window_x, vg.window_y,
- SDL_WINDOW_BORDERLESS|SDL_WINDOW_OPENGL
+ SDL_WINDOW_BORDERLESS|SDL_WINDOW_OPENGL|SDL_WINDOW_INPUT_GRABBED
))){}
#else
0, 0,
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();
-
-#ifndef VG_DEVWINDOW
SDL_SetRelativeMouseMode(1);
-#endif
vg.thread_id_main = SDL_GetThreadID(NULL);
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();
}