#include "vn_platform.h" #include "vn_platform.cpp" #if VN_INTERNAL struct debug_settings { b32 RenderUIDebugRects; b32 RenderFPSCounter; b32 ListHotAndActive; }; per_thread debug_settings *DEBUG_DebugSettings = 0; #endif #include "vn_config.h" #include "vn_tokenizer.h" #include "vn_font.h" #include "vn_text_op.h" #include "vn_ui.h" #include "vn_ui_utils.h" #include "vn_workspace.h" #include "vn_theme_dark.h" #include "vn_animation_curve.h" #include "vn_config.cpp" #include "vn_render.cpp" #include "vn_font.cpp" #include "vn_ui.cpp" #include "vn_ui_utils.cpp" #include "vn_animation_curve.cpp" #include "vn_workspace.cpp" struct vn_state { memory_arena Arena; glyph_atlas *GlyphAtlas; config *Config; ui UI; workspace Workspace; animation_curve_state AnimationCurveState; #if VN_INTERNAL debug_settings DebugSettings; #endif }; VN_UPDATE_AND_RENDER(VN_UpdateAndRender) { SetThreadContext(ThreadContext); Platform = Memory->PlatformAPI; vn_state *State = Memory->State; if(!Memory->State) { State = Memory->State = BootstrapPushStruct(vn_state, Arena); State->GlyphAtlas = CreateGlyphAtlas(RenderCommands); State->Config = BootstrapPushStruct(config, Arena); // sixten: Setup config binds and load current config. { Config_BindS32(State->Config, StrLit("Platform/RefreshRate"), &Input->RefreshRate, 60); #if VN_INTERNAL Config_BindB32(State->Config, StrLit("Dev/RenderUIDebugRects"), &State->DebugSettings.RenderUIDebugRects, 0); Config_BindB32(State->Config, StrLit("Dev/RenderFPSCounter"), &State->DebugSettings.RenderFPSCounter, 0); Config_BindB32(State->Config, StrLit("Dev/ListHotAndActive"), &State->DebugSettings.ListHotAndActive, 0); #endif Config_ReadFile(State->Config, StrLit("config.vn")); } Workspace_Init(&State->Workspace); } #if VN_INTERNAL DEBUG_DebugSettings = &State->DebugSettings; #endif AnimationCurve_NewFrame(&State->AnimationCurveState, Input->dtForFrame); UI_NewFrame(&State->UI, Input->EventList, Input->MouseP, State->GlyphAtlas); UI_BeginBuild(RenderCommands->RenderDim); { Workspace_Update(&State->Workspace, RenderCommands, Input, State->GlyphAtlas); } UI_EndBuild(); for(platform_event *Event = Input->EventList->First; Event != 0; Event = Event->Next) { if(Event->Type == PlatformEvent_WindowClose) { Config_WriteFile(State->Config, StrLit("config.vn")); Input->ExitRequested = true; } Platform_ConsumeEvent(Input->EventList, Event); } render_group Group = BeginRenderGroup(RenderCommands); PushClear(&Group, V3(0.1, 0.1, 0.1)); UI_RenderFrame(&Group, State->GlyphAtlas); if(DEBUG_DebugSettings->ListHotAndActive) { PushText(&Group, State->GlyphAtlas, Font_Regular, V2(5, RenderCommands->RenderDim.y - 20), 15, Color_Grey, PushFormat(&State->UI.FrameArena, "Hot: %S:%llu", UI_GetBoxNameByKey(UI_GetHot()), UI_GetHot())); PushText(&Group, State->GlyphAtlas, Font_Regular, V2(5, RenderCommands->RenderDim.y - 40), 15, Color_Grey, PushFormat(&State->UI.FrameArena, "Active: %S:%llu", UI_GetBoxNameByKey(UI_GetActive()), UI_GetActive())); } }