X-Git-Url: https://harrygodden.com/git/?p=vg.git;a=blobdiff_plain;f=vg_engine.h;fp=vg_engine.h;h=81bbda52ddde891d7d3558fc0b9043c1eb61f0a1;hp=0000000000000000000000000000000000000000;hb=3b14f3dcd5bf9dd3c85144f2123d667bfa4bb63f;hpb=fce86711735b15bff37de0f70716808410fcf269 diff --git a/vg_engine.h b/vg_engine.h new file mode 100644 index 0000000..81bbda5 --- /dev/null +++ b/vg_engine.h @@ -0,0 +1,241 @@ +#pragma once + +/* Copyright (C) 2021-2024 Mt.Zero Software - 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| | |.--------------------------------------------' +| | | | +| | | 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_gui(void) +| | | | +| | | v +|IMP| | vg_game_settings_init(void) +|IMP| | vg_game_settings_gui( ui_rect panel ) +| | | | (optional: #define VG_GAME_SETTINGS) +| | | | +| | '----' +'___' + +*/ + +/* configuration warnings */ + +#ifndef VG_TIMESTEP_FIXED + #warning VG_TIMESTEP_FIXED not defined; setting to 1/60 + #define VG_TIMESTEP_FIXED (1.0/60.0) +#endif + +#ifndef VG_3D + #ifndef VG_2D + #warning VG_3D or VG_2D not defined; defining VG_3D + #define VG_3D + #endif +#endif + +#define VG_ENGINE +#define SDL_MAIN_HANDLED + +#include "dep/glad/glad.h" +#include "dep/sdl/include/SDL.h" + +#include "vg_platform.h" +#include "vg_mem.h" +#include "vg_m.h" +#include "vg_imgui.h" + +#include + +/* API */ +void vg_enter( int argc, char *argv[], const char *window_name ); + +/* Thread 1 */ +void vg_bake_shaders(void); + +extern void vg_preload(void); +extern void vg_load(void); + +/* Main thread */ +extern void vg_launch_opt(void); +extern void vg_framebuffer_resize(int w, int h); +extern void vg_pre_update(void); +extern void vg_fixed_update(void); +extern void vg_post_update(void); + +extern void vg_render(void); +extern void vg_gui(void); + +void vg_settings_open(void); +void vg_settings_close(void); + +enum quality_profile{ + k_quality_profile_high = 0, + k_quality_profile_low = 1, + k_quality_profile_min = 2 +}; + +enum vg_thread_purpose +{ + k_thread_purpose_nothing, + k_thread_purpose_main, + k_thread_purpose_loader +}; + +struct vg_engine { + /* Engine sync */ + SDL_Window *window; + SDL_GLContext gl_context; + + 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; + const char *base_path; + + int display_refresh_rate, + fps_limit, + vsync, + screen_mode, + display_index; + + int settings_open; + + 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; + + i32 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; + + f32 time_fixed_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 */ +#ifdef VG_3D + m4x4f pv; +#else + m3x3f pv; +#endif + + i32 quality_profile; + + float loader_ring; + GLuint tex_missing; + + vg_rand rand; +} +extern vg; + +struct vg_setting_enum +{ + i32 new_value, *actual_value; + + struct ui_enum_opt *options; + u32 option_count; + const char *label; +}; + +struct vg_setting_ranged_i32 +{ + i32 new_value, *actual_value, min, max; + char buf[10]; + const char *label; +}; + +void ui_settings_ranged_i32_init( struct vg_setting_ranged_i32 *prop ); +void ui_settings_enum_init( struct vg_setting_enum *prop ); +bool vg_settings_enum( struct vg_setting_enum *prop, ui_rect rect ); +bool vg_settings_enum_diff( struct vg_setting_enum *prop ); +void vg_settings_ui_header( ui_rect inout_panel, const char *name ); +bool vg_settings_apply_button( ui_rect inout_panel, bool validated ); + +enum engine_status _vg_engine_status(void); +enum vg_thread_purpose vg_thread_purpose(void); + +void vg_checkgl( const char *src_info ); +#define VG_STRINGIT( X ) #X +#define VG_CHECK_GL_ERR() vg_checkgl( __FILE__ ":L" VG_STRINGIT(__LINE__) ) + +/* the few includes we always want. */ +#include "vg_log.h" +#include "vg_shader.h" +#include "vg_console.h"