-/* Copyright (C) 2021-2023 Harry Godden (hgn) - All Rights Reserved */
-
-/*
-
- .-. VG Event loop
-| 0 |
-| | .---------------------------------------------------------.
-|API| | vg_enter( int argc, char *argv[], const char *window_name |
-| | '---------------------------------------------------------'
-| | |
-| | v
-|IMP| vg_launch_opt(void) <--.
-| | | |
-| | |'---------------'
-| | | .-.
-| | |'-----------------------------------| 1 |------.
-| | | | | |
-| | | | | v
-| | | |IMP| vg_preload(void)
-| | | | | |
-| | .-----+. | | v
-| | | | |IMP| vg_load(void)
-| | | v '___' |
-|IMP| | vg_framebuffer_resize(void) |
-| | | | |
-|IMP| | |.------------- vg_start(void) ---------------'
-| | | |
-| | | v
-|IMP| | vg_pre_update(void)
-| | | |
-| | | .-----+.
-| | | | | called 0x to 8x
-| | | | v
-|IMP| | '- vg_fixed_update(void)
-| | | |
-| | | .-'
-| | | |
-| | | v
-|IMP| | vg_post_update(void)
-| | | |
-| | | v
-|IMP| | vg_render(void)
-| | | |
-| | | v
-|IMP| | vg_ui(void)
-| | | |
-| | '----'
-'___'
-
-*/
-
-#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 "dep/sdl/include/SDL.h"
- #include "vg_stdint.h"
-
- void vg_register_exit( void( *funcptr )(void), const char *name );
-
- #include "vg_m.h"
- #include "vg_io.h"
- #include "vg_log.h"
-#ifndef VG_NO_STEAM
- #include "vg_steam.h"
-#endif
-
- //#define VG_SYNC_DEBUG
- #ifdef VG_SYNC_DEBUG
- #define VG_SYNC_LOG(STR,...) \
- vg_info(STR,SDL_GetThreadID(NULL),##__VA_ARGS__)
- #else
- #define VG_SYNC_LOG(...)
- #endif
-
-/* API */
-VG_STATIC void vg_enter( int argc, char *argv[], const char *window_name );
-
-/* Thread 1 */
-VG_STATIC void vg_preload(void);
-VG_STATIC void vg_load(void);
-
-/* Main thread */
-VG_STATIC void vg_launch_opt(void);
-VG_STATIC void vg_start(void);
-
-VG_STATIC void vg_framebuffer_resize(int w, int h);
-VG_STATIC void vg_pre_update(void);
-VG_STATIC void vg_fixed_update(void);
-VG_STATIC void vg_post_update(void);
-
-VG_STATIC void vg_render(void);
-VG_STATIC void vg_gui(void);
-
-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{
- k_engine_status_none,
- k_engine_status_load_internal,
- k_engine_status_running,
- k_engine_status_crashed
- }
- engine_status;
-
- /* Window information */
- int window_x,
- window_y,
- samples,
- window_should_close;
-
- int display_refresh_rate,
- fps_limit; /* 0: use vsync, >0: cap fps to this, no vsync */
-
- enum vsync_feature{
- k_vsync_feature_disabled=0,
- k_vsync_feature_enabled=1,
- k_vsync_feature_enabled_adaptive=2,
- k_vsync_feature_error=3
- }
- vsync_feature;
-
- double mouse_pos[2];
- v2f mouse_delta,
- mouse_wheel;
-
- /* Runtime */
- double time,
- time_real,
- time_delta,
- time_rate,
-
- time_fixed_accumulator,
- time_fixed_extrapolate,
- time_frame_delta;
-
- u64 time_hp, time_hp_last, time_spinning;
-
- int fixed_iterations;
-
- enum engine_stage{
- k_engine_stage_none,
- k_engine_stage_update,
- k_engine_stage_update_fixed,
- k_engine_stage_rendering,
- k_engine_stage_ui
- }
- engine_stage;
-
- /* graphics */
- m4x4f pv;
- 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
-{
- k_thread_purpose_nothing,
- k_thread_purpose_main,
- k_thread_purpose_loader
-};
-
-#include "vg_async.h"
-
-VG_STATIC enum engine_status _vg_engine_status(void)
-{
- SDL_AtomicLock( &vg.sl_status );
- enum engine_status status = vg.engine_status;
- SDL_AtomicUnlock( &vg.sl_status );
-
- return status;
-}
-
-VG_STATIC enum vg_thread_purpose vg_thread_purpose(void)
-{
- SDL_AtomicLock( &vg.sl_status );
-
- if( vg.thread_id_main == SDL_GetThreadID(NULL) ){
- SDL_AtomicUnlock( &vg.sl_status );
- return k_thread_purpose_main;
- }
- else{
- SDL_AtomicUnlock( &vg.sl_status );
- return k_thread_purpose_loader;
- }
-}
-
-VG_STATIC void vg_assert_thread( enum vg_thread_purpose required ){
- enum vg_thread_purpose purpose = vg_thread_purpose();
-
- if( purpose != required ){
- vg_fatal_error( "thread_purpose must be %u not %u\n", required, purpose );
- }
-}
-
-VG_STATIC void _vg_opengl_sync_init(void)
-{
- vg.sem_loader = SDL_CreateSemaphore(1);
-}
-
-VG_STATIC void vg_checkgl( const char *src_info );
-#define VG_STRINGIT( X ) #X
-#define VG_CHECK_GL_ERR() vg_checkgl( __FILE__ ":L" VG_STRINGIT(__LINE__) )
-
-#include "vg_console.h"
-#include "vg_profiler.h"
-#ifndef VG_NO_AUDIO
- #include "vg_audio.h"
-#endif
-#include "vg_shader.h"
-#include "vg_tex.h"
-#include "vg_input.h"
-#include "vg_imgui.h"
-#include "vg_lines.h"
-#include "vg_loader.h"
-#include "vg_opt.h"
-
-/* Diagnostic */
-VG_STATIC struct vg_profile vg_prof_update = {.name="update()"},
- vg_prof_render = {.name="render()"},
- vg_prof_swap = {.name="swap"};
-
-VG_STATIC void vg_checkgl( const char *src_info )
-{
- int fail = 0;
-
- GLenum err;
- while( (err = glGetError()) != GL_NO_ERROR ){
- vg_error( "(%s) OpenGL Error: #%d\n", src_info, err );
- fail = 1;
- }
-
- if( fail )
- vg_fatal_error( "OpenGL Error" );
-}
-
-VG_STATIC void async_vg_bake_shaders( void *payload, u32 size )
-{
- vg_shaders_compile();
-}
-
-VG_STATIC void vg_bake_shaders(void)
-{
- vg_console_reg_cmd( "reload_shaders", vg_shaders_live_recompile, NULL );
- vg_async_call( async_vg_bake_shaders, NULL, 0 );
-}
-
-void async_internal_complete( void *payload, u32 size )
-{
- vg_success( "Internal async setup complete\n" );
- SDL_AtomicLock( &vg.sl_status );
-
- if( vg.engine_status == k_engine_status_crashed ){
- SDL_AtomicUnlock( &vg.sl_status );
- return;
- }
- else{
- vg.engine_status = k_engine_status_running;
- }
-
- SDL_AtomicUnlock( &vg.sl_status );
-}
-
-VG_STATIC void _vg_load_full( void *data )
-{
- vg_preload();
-
- /* internal */
- vg_loader_step( vg_input_init, vg_input_free );
- vg_loader_step( vg_lines_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_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 ){
- if( vg_console.enabled &&
- (vg_ui.focused_control_type != k_ui_control_modal) ){
- if( event.key.keysym.sym == SDLK_ESCAPE ||
- event.key.keysym.scancode == SDL_SCANCODE_GRAVE ){
- 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.scancode == SDL_SCANCODE_GRAVE ){
- 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 )
- {
- vg_input_controller_event( &event );
- }
- else if( event.type == SDL_MOUSEMOTION ){
- vg.mouse_delta[0] += event.motion.xrel;
- vg.mouse_delta[1] += event.motion.yrel;
- }
- else if( event.type == SDL_WINDOWEVENT ){
- if( event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED ){
- int w, h;
- SDL_GL_GetDrawableSize( vg.window, &w, &h );
-
- if( !w || !h ){
- vg_warn( "Got a invalid framebuffer size: "
- "%dx%d... ignoring\n", w, h );
- }
- else{
- vg.window_x = w;
- vg.window_y = h;
-
- vg_framebuffer_resize(w,h);
- }
- }
- else if( event.window.event == SDL_WINDOWEVENT_CLOSE ){
- vg.window_should_close = 1;
- }
- }
- else if( event.type == SDL_TEXTINPUT ){
- ui_proc_utf8( event.text.text );
- }
- }
-
- vg.mouse_pos[0] += vg.mouse_delta[0];
- vg.mouse_pos[1] += vg.mouse_delta[1];
-}
-
-VG_STATIC void _vg_gameloop_update(void)
-{
- vg_profile_begin( &vg_prof_update );
-
- vg.engine_stage = k_engine_stage_update;
- vg_pre_update();
-
- /* Fixed update loop */
- vg.engine_stage = k_engine_stage_update_fixed;
-
- vg.fixed_iterations = 0;
- vg_lines.allow_input = 1;
- vg.time_fixed_accumulator += vg.time_delta;
-
- while( vg.time_fixed_accumulator >= VG_TIMESTEP_FIXED ){
- vg_fixed_update();
- vg_lines.allow_input = 0;
- vg.time_fixed_accumulator -= VG_TIMESTEP_FIXED;
-
- 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.engine_stage = k_engine_stage_update;
- vg_post_update();
- vg_profile_end( &vg_prof_update );
-}
-
-VG_STATIC void _vg_gameloop_render(void)
-{
- vg_profile_begin( &vg_prof_render );
-
- /* render */
- vg.engine_stage = k_engine_stage_rendering;
- vg_render();
-
- /* 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 */
-#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 ){
- char perf[256];
-
- snprintf( perf, 255,
- "x: %d y: %d\n"
- "refresh: %d (%.1fms)\n"
- "samples: %d\n"
- "iterations: %d (acc: %.3fms%%)\n"
- "time: real(%.2f) delta(%.2f) rate(%.2f)\n"
- " extrap(%.2f) frame(%.2f) spin( "PRINTF_U64" )\n",
- vg.window_x, vg.window_y,
- frame_target, (1.0f/(float)frame_target)*1000.0f,
- vg.samples,
- vg.fixed_iterations,
- (vg.time_fixed_accumulator/VG_TIMESTEP_FIXED)*100.0f,
- vg.time_real, vg.time_delta, vg.time_rate,
- 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_postrender();
- }
-
- vg_profile_end( &vg_prof_render );
-}
-
-VG_STATIC int vg_framefilter( double dt )
-{
- if( (vg.fps_limit <= 0) && (vg.vsync_feature != k_vsync_feature_error) ){
- /* turn on vsync if not enabled */
-
- enum vsync_feature requested = k_vsync_feature_enabled;
- if( vg.fps_limit < 0 ) requested = k_vsync_feature_enabled_adaptive;
-
- if( vg.vsync_feature != requested ){
- vg_info( "Setting swap interval\n" );
-
- int swap_interval = 1;
- if( requested == k_vsync_feature_enabled_adaptive ) swap_interval = -1;
-
- if( SDL_GL_SetSwapInterval( swap_interval ) == -1 ){
- if( requested == k_vsync_feature_enabled ){
- vg_error( "Vsync is not supported by your system\n" );
- vg_warn( "You may be overriding it in your"
- " graphics control panel.\n" );
- }
- else{
- vg_error( "Adaptive Vsync is not supported by your system\n" );
- }
-
- vg.vsync_feature = k_vsync_feature_error;
- vg.fps_limit = vg.display_refresh_rate;
-
- /* TODO: Make popup to notify user that this happened */
- return 1;
- }
- else{
- vg_success( "Vsync enabled (%d)\n", requested );
- vg.vsync_feature = requested;
- }
- }
-
- return 0;
- }
-
- if( vg.vsync_feature != k_vsync_feature_disabled ){
- SDL_GL_SetSwapInterval( 0 );
- vg.vsync_feature = k_vsync_feature_disabled;
- }
-
- if( vg.fps_limit < 25 ) vg.fps_limit = 25;
- if( vg.fps_limit > 300 ) vg.fps_limit = 300;
-
- double min_frametime = 1.0/(double)vg.fps_limit;
- if( vg.time_frame_delta < min_frametime ){
- /* TODO: we can use high res nanosleep on Linux here */
- double sleep_ms = (min_frametime-vg.time_frame_delta) * 1000.0;
- u32 ms = (u32)floor( sleep_ms );
-
- if( ms ){
- SDL_Delay( ms );
- }
- else{
- vg.time_spinning ++;
- }
-
- return 1;
- }
-
- return 0;
-}
-
-VG_STATIC int _vg_crashscreen(void)
-{
-#if 0
- if( vg_getkey( SDLK_ESCAPE ) )
- return 1;
-#endif
-
- glBindFramebuffer( GL_FRAMEBUFFER, 0 );
- glEnable(GL_BLEND);
- glDisable(GL_DEPTH_TEST);
- glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA);
- glBlendEquation(GL_FUNC_ADD);
-
- glClearColor( 0.15f + sinf(vg.time_real)*0.1f, 0.0f, 0.0f,1.0f );
- glClear( GL_COLOR_BUFFER_BIT );
- glViewport( 0,0, vg.window_x, vg.window_y );
-
- _vg_render_log();
-
- return 0;
-}
-
-VG_STATIC void _vg_gameloop(void){
- //vg.time_fixed_accumulator = 0.75f * (1.0f/60.0f);
-
- vg.time_hp = SDL_GetPerformanceCounter();
- vg.time_hp_last = vg.time_hp;
-
- int post_start = 0;
- while(1){
-
- vg.time_hp = SDL_GetPerformanceCounter();
- u64 udt = vg.time_hp - vg.time_hp_last;
- vg.time_hp_last = vg.time_hp;
-
- double dt = (double)udt / (double)SDL_GetPerformanceFrequency();
-
- vg.time_frame_delta += dt;
-
- if( vg_framefilter( dt ) )
- continue;
-
- vg_profile_begin( &vg_prof_swap );
- SDL_GL_SwapWindow( vg.window );
- vg_profile_end( &vg_prof_swap );
-
- enum engine_status status = _vg_engine_status();
-
- vg.time_real += vg.time_frame_delta;
- 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{
- if( status == k_engine_status_running ){
- _vg_gameloop_update();
- _vg_gameloop_render();
- }
- else{
- _vg_loader_render();
- }
- }
-
- if( vg.loader_ring > 0.01f ){
- _vg_loader_render_ring( vg.loader_ring );
- vg.loader_ring -= vg.time_frame_delta * 0.5f;
- }
-
- vg.time_frame_delta = 0.0;
- vg.time_spinning = 0;
- }
-}
-
-VG_STATIC void _vg_process_launch_opts_internal( int argc, char *argv[] )
-{
- char *arg;
- while( vg_argp( argc, argv ) ){
- if( (arg = vg_opt_arg( 'w' )) ){
- vg.window_x = atoi( arg );
- }
-
- if( (arg = vg_opt_arg( 'h' )) ){
- vg.window_y = atoi( arg );
- }
-
- if( (arg = vg_long_opt_arg( "samples" )) ){
- vg.samples = VG_MAX( 0, VG_MIN( 8, atoi( arg ) ) );
- }
-
- if( vg_long_opt( "use-libc-malloc" ) ){
- vg_mem.use_libc_malloc = 1;
- }
-
- if( vg_long_opt( "high-performance" ) ){
- vg.quality_profile = k_quality_profile_low;
- }
-
- vg_launch_opt();
- }
-}
-
-VG_STATIC void _vg_init_window( const char *window_name )
-{
- vg_info( "SDL_INIT\n" );
-
- if( SDL_Init( SDL_INIT_VIDEO ) != 0 ){
- vg_error( "SDL_Init failed: %s\n", SDL_GetError() );
- exit(0);
- }
-
-#ifndef VG_NO_AUDIO
- SDL_InitSubSystem( SDL_INIT_AUDIO );
-#endif
- 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 );
- SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK,
- SDL_GL_CONTEXT_PROFILE_CORE );
-
- SDL_GL_SetAttribute( SDL_GL_CONTEXT_RELEASE_BEHAVIOR,
- SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH );
-
- SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
- SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 );
- SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 );
- SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 );
- SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 0 );
-
- /*
- * Get monitor information
- */
- vg_info( "Getting display count\n" );
- int display_count = 0,
- display_index = 0,
- mode_index = 0;
-
- SDL_DisplayMode video_mode;
- if( SDL_GetDesktopDisplayMode( display_index, &video_mode ) ){
- vg_error( "SDL_GetDesktopDisplayMode failed: %s\n", SDL_GetError() );
- SDL_Quit();
- exit(0);
- }
-
- vg.display_refresh_rate = video_mode.refresh_rate;
- vg.window_x = video_mode.w;
- vg.window_y = video_mode.h;
-
-#ifdef VG_DEVWINDOW
- vg.window_x = 1200;
- vg.window_y = 880;
-#endif
-
-#ifndef _WIN32
- SDL_SetHint( "SDL_VIDEO_X11_XINERAMA", "1" );
- SDL_SetHint( "SDL_VIDEO_X11_XRANDR", "0" );
- 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 );
-
- /* TODO: Allow selecting closest video mode from launch opts */
- if((vg.window = SDL_CreateWindow( window_name,
-
-#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,
-
- 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);
- }
- }
-#endif
- else{
- vg_error( "SDL_CreateWindow failed: %s", SDL_GetError() );
- exit(0);
- }
-
- SDL_RaiseWindow( vg.window );
-
- vg_info( "CreateContext\n" );
-
- /* ????? */
- if( SDL_IsTextInputActive() ) SDL_StopTextInput();
-
- /*
- * OpenGL loading
- */
- if( (vg.gl_context = SDL_GL_CreateContext(vg.window) )){
- SDL_GL_GetDrawableSize( vg.window, &vg.window_x, &vg.window_y );
- vg_success( "Window created (%dx%d)\n", vg.window_x, vg.window_y );
- }
- else{
- vg_error( "SDL_GL_CreateContext failed: %s\n", SDL_GetError() );
- SDL_Quit();
- exit(0);
- }
-
- if( !gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress) ) {
- vg_error( "Glad Failed to initialize\n" );
- SDL_GL_DeleteContext( vg.gl_context );
- SDL_Quit();
- exit(0);
- }
-
- const unsigned char* glver = glGetString( GL_VERSION );
- vg_success( "Load setup complete, OpenGL version: %s\n", glver );
-
- SDL_GL_SetSwapInterval(0); /* disable vsync while loading */
-
- SDL_DisplayMode dispmode;
- if( !SDL_GetWindowDisplayMode( vg.window, &dispmode ) ){
- if( dispmode.refresh_rate ){
- vg.display_refresh_rate = dispmode.refresh_rate;
- }
- }
-
- if( vg.display_refresh_rate < 25 || vg.display_refresh_rate > 300 ){
- vg.display_refresh_rate = 60;
- }
-
- vg_info( "Display refresh rate: %d\n", dispmode.refresh_rate );
-
-#if defined(_WIN32) || defined(VG_DEVWINDOW)
- vg.fps_limit = vg.display_refresh_rate;
-#else
- vg.fps_limit = 0;
-#endif
-}
-
-VG_STATIC void _vg_terminate(void)
-{
- /* Shutdown */
- _vg_console_write_persistent();
-
- SDL_AtomicLock( &vg.sl_status );
- vg.engine_status = k_engine_status_none;
- SDL_AtomicUnlock( &vg.sl_status );
-
- _vg_loader_free();
-
- vg_success( "If you see this it means everything went.. \"well\".....\n" );
-
- SDL_GL_DeleteContext( vg.gl_context );
- SDL_Quit();
- exit(0);
-}
-
-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_alloc_quota();
- _vg_console_init();
-
- vg_console_reg_var( "fps_limit", &vg.fps_limit, k_var_dtype_i32, 0 );
- _vg_init_window( window_name );
-
- vg_async_init();
- SDL_SetRelativeMouseMode(1);
-
- vg.thread_id_main = SDL_GetThreadID(NULL);
-
- /* Opengl-required systems */
- _vg_ui_init();
- _vg_loader_init();
-
- vg.engine_status = k_engine_status_load_internal;
-
- _vg_opengl_sync_init();
- vg_loader_start( _vg_load_full, NULL );
- _vg_gameloop();
- _vg_terminate();
-}
-
-VG_STATIC void vg_fatal_error( const char *fmt, ... )
-{
- va_list args;
- va_start( args, fmt );
- _vg_logx_va( stderr, NULL, "fatal", KRED, fmt, args );
- va_end( args );
-
- vg_print_backtrace();
-
- SDL_AtomicLock( &vg.sl_status );
- vg.engine_status = k_engine_status_crashed;
- SDL_AtomicUnlock( &vg.sl_status );
-
- if( vg_thread_purpose() == k_thread_purpose_loader ){
- longjmp( vg.env_loader_exit, 1 );
- }
- else{
- vg_error( "There is no jump to the error runner thing yet! bai bai\n" );
- _vg_terminate();
- }
-}
-
-#else /* VG_GAME */
-
-#include "vg_log.h"
-VG_STATIC void vg_fatal_error( const char *fmt, ... )
-{
- va_list args;
- va_start( args, fmt );
- _vg_logx_va( stderr, NULL, "fatal", KRED, fmt, args );
- va_end( args );
- exit(0);
-}
-
-#endif /* VG_GAME */
-
-/*
- * Graphic cards will check these to force it to use the GPU
- */
-u32 NvOptimusEnablement = 0x00000001;
-int AmdPowerXpressRequestHighPerformance = 1;
-
-#include "vg_log.c"
-
-#endif /* VG_HEADER_H */
+hc vg_build.h
+hc vg_build_utils_shader.h
+hc vg_m.h
+
+u32arr vg_pxfont.h
+u32arr vg_pxfont_thin.h
+
+vg_platform.h ??
+
+# vg_vorbis.h
+# vg_image.h
+# vg_depencies.c
+
+# vg_async.h
+# vg_async.c
+# vg_audio_dsp.h
+# vg_audio_dsp.c
+# vg_audio.h
+# vg_audio.c
+# vg_audio_synth_bird.h
+# vg_audio_synth_bird.c
+# vg_binstr.h
+# vg_binstr.c
+# vg_bvh.h
+# vg_bvh.c
+# vg_camera.h
+# vg_camera.c
+# vg_engine.c
+# vg_engine.h
+# vg_log.h
+# vg_log.c
+# vg_tex.c
+# vg_tex.h
+# vg_console.h
+# vg_console.c
+# vg_loader.h
+# vg_loader.c
+# vg_imgui.h
+# vg_imgui.c
+# vg_input.h
+# vg_input.c
+# vg_io.h
+# vg_io.c
+
+# vg_lines.h
+# vg_lines.c
+
+vg_mem.h
+vg_mem.c
+vg_mem_pool.h
+vg_mem_pool.c
+vg_mem_queue.h
+vg_mem_queue.c
+vg_msg.h
+vg_msg.c
+vg_opt.h
+vg_opt.c
+vg_perlin.h
+vg_perlin.c
+vg_string.h
+vg_string.c
+vg_profiler.h
+vg_profiler.c
+vg_rigidbody_collision.h
+vg_rigidbody_collision.c
+vg_rigidbody_constraints.h
+vg_rigidbody_constraints.c
+vg_rigidbody.h
+vg_rigidbody.c
+vg_rigidbody_view.h
+vg_rigidbody_view.c
+vg_shader.h
+vg_shader.c
+
+vg_steam.h
+vg_steam_auth.h
+vg_steam_friends.h
+vg_steam_http.h
+vg_steam_networking.h
+vg_steam_remote_storage.h
+vg_steam_ugc.h
+vg_steam_user_stats.h
+vg_steam_utils.h
+
+vg_tool.c
+vg_tool.h