X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vg%2Fvg.h;fp=vg%2Fvg.h;h=575bf036eeabf667aa322983555a3a2dee818830;hb=6836e834f8db725e08015a98401f2be97e5b9849;hp=0000000000000000000000000000000000000000;hpb=b5740880fe3ffe59546bb80173ad3a6e1312648e;p=vg.git diff --git a/vg/vg.h b/vg/vg.h new file mode 100644 index 0000000..575bf03 --- /dev/null +++ b/vg/vg.h @@ -0,0 +1,312 @@ +// Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gl/glad/glad.h" +#include "gl/glfw3.h" + +#define STB_DS_IMPLEMENTATION +#include "stb/stb_ds.h" +//#define STB_IMAGE_IMPLEMENTATION +//#include "stb/stb_image.h" + +#define QOI_IMPLEMENTATION +#include "phoboslab/qoi.h" + +#include "vg/vg_platform.h" + +void vg_register_exit( void( *funcptr )(void), const char *name ); +void vg_exiterr( const char *strErr ); + +m3x3f vg_pv; + +#include "vg/vg_m.h" +#include "vg/vg_io.h" +#include "vg/vg_gldiag.h" + +#ifndef VG_TOOLS + +// Engine globals +GLFWwindow* vg_window; + +// 1366, 768 +// 1920, 1080 + +#ifdef VG_CAPTURE_MODE +int vg_window_x = 1920; +int vg_window_y = 1080; +#else +int vg_window_x = 1366; +int vg_window_y = 768; +#endif + +v2f vg_mouse; +v2f vg_mouse_wheel; +v3f vg_mouse_ws; + +float vg_time; +float vg_time_last; +float vg_time_delta; + +// Engine components +#include "vg/vg_audio.h" +#include "vg/vg_shader.h" +#include "vg/vg_lines.h" +#include "vg/vg_tex.h" +#include "vg/vg_input.h" +#include "vg/vg_ui.h" +#include "vg/vg_console.h" +#include "vg/vg_debug.h" + +#ifdef VG_STEAM +#include "vg/vg_steamworks.h" +#endif + +// Engine main +// =========================================================================================================== + +#ifndef VG_RELEASE +void vg_checkgl( const char *src_info ) +{ + GLenum err; + while( (err = glGetError()) != GL_NO_ERROR ) + { + vg_error( "(%s) OpenGL Error: #%d\n", src_info, err ); + } +} + + #define VG_STRINGIT( X ) #X + #define VG_CHECK_GL() vg_checkgl( __FILE__ ":L" VG_STRINGIT(__LINE__) ) +#else + #define VG_CHECK_GL() +#endif + + +#define VG_GAMELOOP + +void( *vg_on_exit[16] )(void); +u32 vg_exit_count = 0; + +// Add a shutdown step +void vg_register_exit( void( *funcptr )(void), const char *name ) +{ + vg_info( "exit registered: (%u)'%s'\n", vg_exit_count, name ); + vg_on_exit[ vg_exit_count ++ ] = funcptr; +} + +void vg_exit(void) +{ + for( int i = vg_exit_count-1; i >= 0; i -- ) + { + vg_info( "engine_exit[%d]()\n", i ); + vg_on_exit[i](); + } + + vg_info( "done\n" ); +} + +// Forcefully exit program after error +void vg_exiterr( const char *strErr ) +{ + vg_error( "Engine Fatal: %s\n", strErr ); + vg_exit(); + exit(0); +} + +// Callbacks +// --------- + +void vg_mouse_callback( GLFWwindow* ptrW, double xpos, double ypos ) +{ + vg_mouse[0] = xpos; + vg_mouse[1] = ypos; +} + +void vg_scroll_callback( GLFWwindow* ptrW, double xoffset, double yoffset ) +{ + vg_mouse_wheel[0] += xoffset; + vg_mouse_wheel[1] += yoffset; +} + +void vg_framebuffer_resize_callback( GLFWwindow *ptrW, int w, int h ) +{ + vg_window_x = w; + vg_window_y = h; +} + +static void vg_register(void) VG_GAMELOOP; +static void vg_start(void) VG_GAMELOOP; +static void vg_update(void) VG_GAMELOOP; +static void vg_render(void) VG_GAMELOOP; +static void vg_ui(void) VG_GAMELOOP; +static void vg_free(void) VG_GAMELOOP; + +static void vg_init( int argc, char *argv[], const char *window_name ) +{ +#ifdef VG_STEAM + // Initialize steamworks + if( !sw_init() ) + return; +#endif + + // Context creation + // ========================================================================================================================== + glfwInit(); + glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 3 ); + glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 3 ); + glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE ); + glfwWindowHint( GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE ); + +#ifdef VG_CAPTURE_MODE + glfwWindowHint( GLFW_RESIZABLE, GLFW_FALSE ); +#else + glfwWindowHint( GLFW_RESIZABLE, GLFW_TRUE ); +#endif + + glfwWindowHint( GLFW_SAMPLES, 4 ); + + GLFWmonitor *monitor_primary = glfwGetPrimaryMonitor(); + + const GLFWvidmode *mode = glfwGetVideoMode( monitor_primary ); + glfwWindowHint( GLFW_RED_BITS, mode->redBits ); + glfwWindowHint( GLFW_GREEN_BITS, mode->greenBits ); + glfwWindowHint( GLFW_BLUE_BITS, mode->blueBits ); + glfwWindowHint( GLFW_REFRESH_RATE, mode->refreshRate ); + + if( !(vg_window = glfwCreateWindow( vg_window_x, vg_window_y, window_name, NULL, NULL)) ) + { + vg_exiterr( "GLFW Failed to initialize" ); + } + else + { + vg_register_exit( &glfwTerminate, "glfwTerminate" ); + } + + glfwMakeContextCurrent( vg_window ); + glfwSwapInterval( 1 ); + + // Set callbacks + glfwSetFramebufferSizeCallback( vg_window, vg_framebuffer_resize_callback ); + + glfwSetCursorPosCallback( vg_window, vg_mouse_callback ); + glfwSetScrollCallback( vg_window, vg_scroll_callback ); + + glfwSetCharCallback( vg_window, console_proc_wchar ); + glfwSetKeyCallback( vg_window, console_proc_key ); + //glfwSetInputMode(vg_window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN); + + if( !gladLoadGLLoader((GLADloadproc)glfwGetProcAddress) ) + { + vg_exiterr( "Glad failed to initialize" ); + } + + const unsigned char* glver = glGetString( GL_VERSION ); + vg_success( "Load setup complete, OpenGL version: %s\n", glver ); + + vg_run_gfx_diagnostics(); + + for( int id = 0; id <= GLFW_JOYSTICK_LAST; id ++ ) + { + if( glfwJoystickIsGamepad( id ) ) + { + vg_gamepad_name = glfwGetGamepadName( id ); + vg_success( "Gamepad with mapping registered: %s\n", vg_gamepad_name ); + + vg_gamepad_ready = 1; + vg_gamepad_id = id; + + break; + } + } + + vg_lines_init(); + vg_register_exit( &vg_lines_free, "vg_lines_free" ); + ui_default_init(); + vg_register_exit( &ui_default_free, "UI" ); + + vg_register(); + vg_register_exit( &vg_free, "vg_free" ); + + if( vg_shaders_compile() ) + { + vg_start(); + + vg_console_init(); + vg_register_exit( &vg_console_free, "Console" ); + + vg_audio_init(); + vg_register_exit( &vg_audio_free, "vg_audio_free" ); + + vg_debugtools_setup(); + + // Main gameloop + while( !glfwWindowShouldClose( vg_window ) ) + { + v2_copy( (v2f){ 0.0f, 0.0f }, vg_mouse_wheel ); + + glfwPollEvents(); + + #ifdef VG_STEAM + sw_event_loop(); + #endif + + vg_time_last = vg_time; + vg_time = glfwGetTime(); + vg_time_delta = vg_minf( vg_time - vg_time_last, 0.1f ); + + vg_update_inputs(); + vg_update(); + vg_render(); + + vg_lines_drawall((float*)vg_pv); + + { + ui_begin( &ui_global_ctx, vg_window_x, vg_window_y ); + ui_set_mouse( &ui_global_ctx, vg_mouse[0], vg_mouse[1], vg_get_button_state( "primary" ) ); + + vg_ui(); + vg_console_draw(); + vg_debugtools_draw(); + + ui_resolve( &ui_global_ctx ); + ui_draw( &ui_global_ctx, NULL ); + } + + glfwSwapBuffers( vg_window ); + + VG_CHECK_GL(); + } + } + + vg_exit(); +} + +// Screen projections +// ============================================================================================ + +void vg_projection_update(void) +{ + // Do transform local->world + vg_mouse_ws[0] = vg_mouse[0]; + vg_mouse_ws[1] = vg_mouse[1]; + vg_mouse_ws[2] = 1.0f; + + vg_mouse_ws[0] = (2.0f * vg_mouse_ws[0]) / ((float)vg_window_x) - 1.0f; + vg_mouse_ws[1] = -((2.0f * vg_mouse_ws[1]) / ((float)vg_window_y) - 1.0f); + + m3x3f inverse; + m3x3_inv( vg_pv, inverse ); + m3x3_mulv( inverse, vg_mouse_ws, vg_mouse_ws ); +} + +#endif + +u32 NvOptimusEnablement = 0x00000001; +int AmdPowerXpressRequestHighPerformance = 1;