From 09db50e3d4f86ee7db99eb95459a79316823aa87 Mon Sep 17 00:00:00 2001 From: PS Date: Tue, 12 Apr 2022 07:53:32 +0200 Subject: [PATCH] scratch memory, sculpture rendering, wasm updates --- .../wasm/debug/lumenarium_wasm_imports.js | 76 +- run_tree/win32/intel/debug/debug.rdbg | Bin 1488 -> 2147 bytes .../intel/debug/lumenarium_first_win32.obj | Bin 473884 -> 595328 bytes src/app/editor/foldhaus_panel.h | 478 ++--- src_v2/editor/lumenarium_editor.cpp | 223 +- src_v2/editor/lumenarium_editor.h | 10 + ...lumenarium_editor_sculpture_visualizer.cpp | 100 + src_v2/editor/lumenarium_editor_ui.cpp | 225 +- src_v2/editor/lumenarium_editor_ui.h | 18 +- src_v2/engine/lumenarium_engine.cpp | 3 +- src_v2/engine/lumenarium_engine_assembly.cpp | 19 + src_v2/libs/stb_sprintf.h | 1906 +++++++++++++++++ src_v2/lumenarium_bsp.h | 492 +++++ src_v2/lumenarium_first.cpp | 17 +- src_v2/lumenarium_first.h | 10 +- src_v2/lumenarium_geometry.h | 268 +++ src_v2/lumenarium_memory.cpp | 32 + src_v2/lumenarium_random.h | 47 + src_v2/lumenarium_string.cpp | 4 +- src_v2/lumenarium_tests.cpp | 67 +- src_v2/lumenarium_types.h | 69 + src_v2/platform/lumenarium_platform.h | 12 +- .../lumenarium_platform_common_includes.h | 3 + .../platform/wasm/lumenarium_first_wasm.cpp | 1 + src_v2/platform/wasm/lumenarium_wasm_file.cpp | 11 + .../platform/wasm/lumenarium_wasm_imports.js | 76 +- .../platform/wasm/lumenarium_wasm_webgl.cpp | 52 +- .../platform/win32/lumenarium_first_win32.cpp | 4 +- .../win32/lumenarium_win32_graphics.cpp | 19 +- src_v2/user_space/user_space_incenter.cpp | 58 +- 30 files changed, 3874 insertions(+), 426 deletions(-) create mode 100644 src_v2/editor/lumenarium_editor_sculpture_visualizer.cpp create mode 100644 src_v2/libs/stb_sprintf.h create mode 100644 src_v2/lumenarium_bsp.h create mode 100644 src_v2/lumenarium_geometry.h create mode 100644 src_v2/lumenarium_random.h diff --git a/run_tree/wasm/debug/lumenarium_wasm_imports.js b/run_tree/wasm/debug/lumenarium_wasm_imports.js index 29d372c..ff42920 100644 --- a/run_tree/wasm/debug/lumenarium_wasm_imports.js +++ b/run_tree/wasm/debug/lumenarium_wasm_imports.js @@ -92,20 +92,69 @@ var lumenarium_wasm_imports = { }, wasm_mem_grow: (new_size) => { - let pages = new_size / WASM_PAGE_SIZE; + let new_size_ = new_size >>> 0; + let pages = new_size_ / WASM_PAGE_SIZE; let pages_rem = fract(pages); if (pages_rem > 0) pages = Math.floor(pages) + 1; let size_before = lumenarium_wasm_instance.exports.memory.buffer.byteLength; let old_page_count = lumenarium_wasm_instance.exports.memory.grow(pages); console.log("mem_grow\n", - "req size: ", new_size, "\n", + "req size: ", new_size_, "\n", "old size: ", (old_page_count * WASM_PAGE_SIZE), "\n", "old size: ", size_before, "\n", "grew by: ", (pages * WASM_PAGE_SIZE), "\n", "new size: ", lumenarium_wasm_instance.exports.memory.buffer.byteLength, ""); }, + malloc: (size) => { + + }, + + free: (base) => { + + }, + + sin: Math.sin, + sinf: Math.sin, + cos: Math.cos, + cosf: Math.cos, + tan: Math.tan, + tanf: Math.tan, + asin: Math.asin, + asinf: Math.asin, + acos: Math.acos, + acosf: Math.acos, + atan: Math.atan, + atanf: Math.atan, + pow: Math.pow, + powf: Math.pow, + fmodf: (f,d) => { return f % d; }, + strlen: (ptr) => { + let len = 0; + let len_checked = 0; + let len_to_check = 256; + let found_end = false; + while (true) + { + let string = wasm_mem_get_u8_arr(lumenarium_wasm_instance, ptr, len_checked); + for (let i = len_checked; i < len_to_check; i++) + { + if (string[i] == 0) + { + len = i; + break; + } + } + len_checked *= 2; + } + return len_checked; + }, + + wasm_platform_file_async_work_on_job: (path, path_len, data, data_size, read, write) => { + + }, + wasm_performance_now: () => { return performance.now(); }, @@ -260,6 +309,14 @@ function glBufferData(target, size, ptr, usage) return r; } +function glBufferSubData(target, offset, size, ptr) +{ + let data = wasm_mem_get_u8_arr(lumenarium_wasm_instance, ptr, size); + const r = gl.bufferSubData(target, offset, data, 0, size); + glErrorReport(arguments); + return r; +} + function glCreateShader(kind) { let shader = gl.createShader(kind); @@ -395,6 +452,17 @@ function glTexSubImage2D(target, level, offsetx, offsety, width, height, format, return r; } +function glGetUniformLocation(program, name, name_len) +{ + // TODO(PS): complete + return 0; +} + +function glUniformMatrix4fv() +{ + // TODO(PS): +} + function webgl_add_imports (canvas_selector, imports) { const canvas = document.querySelector(canvas_selector); if (!canvas) return console.error("no canvas"); @@ -414,6 +482,7 @@ function webgl_add_imports (canvas_selector, imports) { imports.glCreateBuffer = glCreateBuffer; imports.glBindBuffer = glBindBuffer; imports.glBufferData = glBufferData; + imports.glBufferSubData = glBufferSubData; imports.glCreateShader = glCreateShader; imports.glShaderSource = glShaderSource; imports.glCompileShader = glCompileShader; @@ -431,5 +500,8 @@ function webgl_add_imports (canvas_selector, imports) { imports.glTexImage2D = glTexImage2D; imports.glTexSubImage2D = glTexSubImage2D; imports.glBindTexture = glBindTexture; + imports.glGetUniformLocation = glGetUniformLocation; + imports.glUniformMatrix4fv = glUniformMatrix4fv; + return imports; } \ No newline at end of file diff --git a/run_tree/win32/intel/debug/debug.rdbg b/run_tree/win32/intel/debug/debug.rdbg index 24dbe61ef213c4152686ca14906596a6c51d642e..3304be4bd665ee11a87f027ea2e3ec724a195e10 100644 GIT binary patch delta 451 zcmXv~%SyvQ6m6PDlxkH7Do7yon4YI|{fAYRqo zkxoFcjJ6;uPmv_VT||Q44SIgYG6*B`W$?f*9V-$S4>Ws&~<QL@v9Vw<7$)kNNv&#G#kHmt1`U6xTtwR&@ws+`*JaR6OPG XbI+|WU#w`4+At^z;!bOco;Ldn*@KLk delta 263 zcmaDXaDjV57%MLW1B1ilkId?m{h7HZ-(?k?oXqOZ=mr*XWL0AH1hW<}N>1iw<(cfl zqB*&TReZ7oi^t>-%pr`vKv_rbw9KO7lKAq>JY%ED@yrgBlbMZK!D5roGMZ18W#(e^ z1FCbM{D29@>SN;KWdzy`0wCG~Yzxo@$t9`9CB=Hl1qFOSVGw2q;@tew;?(#886dN` zB(Wq_*Df=!ptK|&%+X6LO3Y1-&&V%f1d2{TYQ VJvD#wS+-slJ=0|mCdaYQ1^@<0PEP;; diff --git a/run_tree/win32/intel/debug/lumenarium_first_win32.obj b/run_tree/win32/intel/debug/lumenarium_first_win32.obj index 7c9356ef88532028ab2955e1e738319a8f81a6b5..6284fe59da7efa8e6fc798566618ac00b32ca5e6 100644 GIT binary patch literal 595328 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 diff --git a/src/app/editor/foldhaus_panel.h b/src/app/editor/foldhaus_panel.h index aec8cb9..b8a59a8 100644 --- a/src/app/editor/foldhaus_panel.h +++ b/src/app/editor/foldhaus_panel.h @@ -11,11 +11,11 @@ enum panel_split_direction { - PanelSplit_NoSplit, - PanelSplit_Horizontal, - PanelSplit_Vertical, - - PanelSplit_Count, + PanelSplit_NoSplit, + PanelSplit_Horizontal, + PanelSplit_Vertical, + + PanelSplit_Count, }; typedef struct panel panel; @@ -25,32 +25,32 @@ typedef PANEL_MODAL_OVERRIDE_CALLBACK(panel_modal_override_callback); struct panel { - s32 TypeIndex; - gs_data StateMemory; - - panel* ModalOverride; - panel* IsModalOverrideFor; - panel_modal_override_callback* ModalOverrideCB; - - rect2 Bounds; - panel_split_direction SplitDirection; - r32 SplitPercent; - - panel* Parent; - - union{ - panel* Left; - panel* Top; - }; - union{ - panel* Right; - panel* Bottom; - }; + s32 TypeIndex; + gs_data StateMemory; + + panel* ModalOverride; + panel* IsModalOverrideFor; + panel_modal_override_callback* ModalOverrideCB; + + rect2 Bounds; + panel_split_direction SplitDirection; + r32 SplitPercent; + + panel* Parent; + + union{ + panel* Left; + panel* Top; + }; + union{ + panel* Right; + panel* Bottom; + }; }; struct free_panel { - free_panel* Next; + free_panel* Next; }; #define PANEL_INIT_PROC(name) void name(panel* Panel, app_state* State, context Context) @@ -65,25 +65,25 @@ typedef PANEL_RENDER_PROC(panel_render_proc); // NOTE(Peter): This is used by the meta system to generate panel type info struct panel_definition { - char* PanelName; - s32 PanelNameLength; - panel_init_proc* Init; - panel_cleanup_proc* Cleanup; - panel_render_proc* Render; - input_command* InputCommands; - s32 InputCommandsCount; + char* PanelName; + s32 PanelNameLength; + panel_init_proc* Init; + panel_cleanup_proc* Cleanup; + panel_render_proc* Render; + input_command* InputCommands; + s32 InputCommandsCount; }; #define PANELS_MAX 16 struct panel_system { - panel_definition* PanelDefs; - u32 PanelDefsCount; - - panel* Panels; - u32 PanelsUsed; - - free_panel* FreeList; + panel_definition* PanelDefs; + u32 PanelDefsCount; + + panel* Panels; + u32 PanelsUsed; + + free_panel* FreeList; }; ///////////////////////////////// @@ -95,164 +95,164 @@ struct panel_system internal void PanelSystem_Init(panel_system* PanelSystem, panel_definition* PanelDefs, u32 PanelDefsCount, gs_memory_arena* Storage) { - PanelSystem->FreeList = 0; - PanelSystem->PanelDefs = PanelDefs; - PanelSystem->PanelDefsCount = PanelDefsCount; - - PanelSystem->Panels = PushArray(Storage, panel, PANELS_MAX); + PanelSystem->FreeList = 0; + PanelSystem->PanelDefs = PanelDefs; + PanelSystem->PanelDefsCount = PanelDefsCount; + + PanelSystem->Panels = PushArray(Storage, panel, PANELS_MAX); } internal panel* PanelSystem_TakePanel(panel_system* PanelSystem) { - panel* FreeEntry = 0; - if (PanelSystem->FreeList != 0) - { - free_panel* FreePanel = PanelSystem->FreeList; - PanelSystem->FreeList = FreePanel->Next; - FreeEntry = (panel*)FreePanel; - } - else - { - Assert(PanelSystem->PanelsUsed < PANELS_MAX); - FreeEntry = PanelSystem->Panels + PanelSystem->PanelsUsed++; - } - return FreeEntry; + panel* FreeEntry = 0; + if (PanelSystem->FreeList != 0) + { + free_panel* FreePanel = PanelSystem->FreeList; + PanelSystem->FreeList = FreePanel->Next; + FreeEntry = (panel*)FreePanel; + } + else + { + Assert(PanelSystem->PanelsUsed < PANELS_MAX); + FreeEntry = PanelSystem->Panels + PanelSystem->PanelsUsed++; + } + return FreeEntry; } internal void PanelSystem_FreePanel(panel* Panel, panel_system* PanelSystem) { - Assert(Panel >= PanelSystem->Panels && Panel <= PanelSystem->Panels + PANELS_MAX); - - free_panel* FreeEntry = (free_panel*)Panel; - FreeEntry->Next = PanelSystem->FreeList; - PanelSystem->FreeList = FreeEntry; + Assert(Panel >= PanelSystem->Panels && Panel <= PanelSystem->Panels + PANELS_MAX); + + free_panel* FreeEntry = (free_panel*)Panel; + FreeEntry->Next = PanelSystem->FreeList; + PanelSystem->FreeList = FreeEntry; } internal void PanelSystem_FreePanelRecursive(panel* Panel, panel_system* PanelSystem) { - if (Panel->SplitDirection != PanelSplit_NoSplit) - { - PanelSystem_FreePanelRecursive(Panel->Left, PanelSystem); - PanelSystem_FreePanelRecursive(Panel->Right, PanelSystem); - } - PanelSystem_FreePanel(Panel, PanelSystem); + if (Panel->SplitDirection != PanelSplit_NoSplit) + { + PanelSystem_FreePanelRecursive(Panel->Left, PanelSystem); + PanelSystem_FreePanelRecursive(Panel->Right, PanelSystem); + } + PanelSystem_FreePanel(Panel, PanelSystem); } internal panel* Panel_GetModalOverride(panel* Panel) { - panel* Result = Panel; - if (Panel->ModalOverride != 0) - { - Result = Panel_GetModalOverride(Panel->ModalOverride); - } - return Result; + panel* Result = Panel; + if (Panel->ModalOverride != 0) + { + Result = Panel_GetModalOverride(Panel->ModalOverride); + } + return Result; } internal void Panel_PushModalOverride(panel* Root, panel* Override, panel_modal_override_callback* Callback) { - Root->ModalOverride = Override; - Root->ModalOverrideCB = Callback; - Override->IsModalOverrideFor = Root; - Override->Bounds = Root->Bounds; + Root->ModalOverride = Override; + Root->ModalOverrideCB = Callback; + Override->IsModalOverrideFor = Root; + Override->Bounds = Root->Bounds; } internal void Panel_PopModalOverride(panel* Parent, panel_system* System) { - // TODO(pjs): Free the overrided panel - PanelSystem_FreePanel(Parent->ModalOverride, System); - Parent->ModalOverride = 0; + // TODO(pjs): Free the overrided panel + PanelSystem_FreePanel(Parent->ModalOverride, System); + Parent->ModalOverride = 0; } internal void Panel_SetCurrentType(panel* Panel, panel_system* System, s32 NewPanelType, gs_data TypeStateMemory, app_state* State, context Context) { - s32 OldTypeIndex = Panel->TypeIndex; - - Panel->TypeIndex = NewPanelType; - Panel->StateMemory = TypeStateMemory; - - if(OldTypeIndex >= 0) - { - System->PanelDefs[OldTypeIndex].Cleanup(Panel, State); - } + s32 OldTypeIndex = Panel->TypeIndex; + + Panel->TypeIndex = NewPanelType; + Panel->StateMemory = TypeStateMemory; + + if(OldTypeIndex >= 0) + { + System->PanelDefs[OldTypeIndex].Cleanup(Panel, State); + } } internal void Panel_SetType(panel* Panel, panel_system* System, s32 NewPanelTypeIndex, app_state* State, context Context) { - gs_data EmptyStateData = {0}; - Panel_SetCurrentType(Panel, System, NewPanelTypeIndex, EmptyStateData, State, Context); - System->PanelDefs[NewPanelTypeIndex].Init(Panel, State, Context); + gs_data EmptyStateData = {0}; + Panel_SetCurrentType(Panel, System, NewPanelTypeIndex, EmptyStateData, State, Context); + System->PanelDefs[NewPanelTypeIndex].Init(Panel, State, Context); } #define Panel_GetStateStruct(p, type) (type*)Panel_GetStateMemory((p), sizeof(type)).Memory internal gs_data Panel_GetStateMemory(panel* Panel, u64 Size) { - Assert(Panel->StateMemory.Size == Size); - gs_data Result = Panel->StateMemory; - return Result; + Assert(Panel->StateMemory.Size == Size); + gs_data Result = Panel->StateMemory; + return Result; } internal panel* PanelSystem_PushPanel(panel_system* PanelSystem, s32 PanelTypeIndex, app_state* State, context Context) { - panel* Panel = PanelSystem_TakePanel(PanelSystem); - Panel_SetType(Panel, PanelSystem, PanelTypeIndex, State, Context); - return Panel; + panel* Panel = PanelSystem_TakePanel(PanelSystem); + Panel_SetType(Panel, PanelSystem, PanelTypeIndex, State, Context); + return Panel; } internal void SplitPanel(panel* Parent, r32 Percent, panel_split_direction SplitDirection, panel_system* PanelSystem, app_state* State, context Context) { - if (Percent >= 0.0f && Percent <= 1.0f) - { - Parent->SplitDirection = SplitDirection; - Parent->SplitPercent = Percent; - - s32 ParentTypeIndex = Parent->TypeIndex; - gs_data ParentStateMemory = Parent->StateMemory; - - Parent->Left = PanelSystem_TakePanel(PanelSystem); - Panel_SetCurrentType(Parent->Left, PanelSystem, ParentTypeIndex, ParentStateMemory, State, Context); - Parent->Left->Parent = Parent; - - Parent->Right = PanelSystem_TakePanel(PanelSystem); - Panel_SetCurrentType(Parent->Right, PanelSystem, ParentTypeIndex, ParentStateMemory, State, Context); - Parent->Right->Parent = Parent; - } + if (Percent >= 0.0f && Percent <= 1.0f) + { + Parent->SplitDirection = SplitDirection; + Parent->SplitPercent = Percent; + + s32 ParentTypeIndex = Parent->TypeIndex; + gs_data ParentStateMemory = Parent->StateMemory; + + Parent->Left = PanelSystem_TakePanel(PanelSystem); + Panel_SetCurrentType(Parent->Left, PanelSystem, ParentTypeIndex, ParentStateMemory, State, Context); + Parent->Left->Parent = Parent; + + Parent->Right = PanelSystem_TakePanel(PanelSystem); + Panel_SetCurrentType(Parent->Right, PanelSystem, ParentTypeIndex, ParentStateMemory, State, Context); + Parent->Right->Parent = Parent; + } } internal void SplitPanelVertically(panel* Parent, r32 Percent, panel_system* PanelSystem, app_state* State, context Context) { - SplitPanel(Parent, Percent, PanelSplit_Vertical, PanelSystem, State, Context); + SplitPanel(Parent, Percent, PanelSplit_Vertical, PanelSystem, State, Context); } internal void SplitPanelHorizontally(panel* Parent, r32 Percent, panel_system* PanelSystem, app_state* State, context Context) { - SplitPanel(Parent, Percent, PanelSplit_Horizontal, PanelSystem, State, Context); + SplitPanel(Parent, Percent, PanelSplit_Horizontal, PanelSystem, State, Context); } internal void ConsolidatePanelsKeepOne(panel* Parent, panel* PanelToKeep, panel_system* PanelSystem) { - panel* LeftChild = Parent->Left; - panel* RightChild = Parent->Right; - - panel* PanelToDestroy = PanelToKeep == LeftChild ? RightChild : LeftChild; - - *Parent = *PanelToKeep; - - PanelSystem_FreePanel(PanelToKeep, PanelSystem); - PanelSystem_FreePanelRecursive(PanelToDestroy, PanelSystem); + panel* LeftChild = Parent->Left; + panel* RightChild = Parent->Right; + + panel* PanelToDestroy = PanelToKeep == LeftChild ? RightChild : LeftChild; + + *Parent = *PanelToKeep; + + PanelSystem_FreePanel(PanelToKeep, PanelSystem); + PanelSystem_FreePanelRecursive(PanelToDestroy, PanelSystem); } ///////////////////////////////// @@ -264,178 +264,178 @@ ConsolidatePanelsKeepOne(panel* Parent, panel* PanelToKeep, panel_system* PanelS internal rect2 GetTopPanelBounds(panel* Panel) { - rect2 Result = {}; - Result.Min = v2{ - Panel->Bounds.Min.x, - LerpR32(Panel->SplitPercent, Panel->Bounds.Min.y, Panel->Bounds.Max.y) - }; - Result.Max = Panel->Bounds.Max; - return Result; + rect2 Result = {}; + Result.Min = v2{ + Panel->Bounds.Min.x, + LerpR32(Panel->SplitPercent, Panel->Bounds.Min.y, Panel->Bounds.Max.y) + }; + Result.Max = Panel->Bounds.Max; + return Result; } internal rect2 GetBottomPanelBounds(panel* Panel) { - rect2 Result = {}; - Result.Min = Panel->Bounds.Min; - Result.Max = v2{ - Panel->Bounds.Max.x, - LerpR32(Panel->SplitPercent, Panel->Bounds.Min.y, Panel->Bounds.Max.y) - }; - return Result; + rect2 Result = {}; + Result.Min = Panel->Bounds.Min; + Result.Max = v2{ + Panel->Bounds.Max.x, + LerpR32(Panel->SplitPercent, Panel->Bounds.Min.y, Panel->Bounds.Max.y) + }; + return Result; } internal rect2 GetRightPanelBounds(panel* Panel) { - rect2 Result = {}; - Result.Min = v2{ - LerpR32(Panel->SplitPercent, Panel->Bounds.Min.x, Panel->Bounds.Max.x), - Panel->Bounds.Min.y - }; - Result.Max = Panel->Bounds.Max; - return Result; + rect2 Result = {}; + Result.Min = v2{ + LerpR32(Panel->SplitPercent, Panel->Bounds.Min.x, Panel->Bounds.Max.x), + Panel->Bounds.Min.y + }; + Result.Max = Panel->Bounds.Max; + return Result; } internal rect2 GetLeftPanelBounds(panel* Panel) { - rect2 Result = {}; - Result.Min = Panel->Bounds.Min; - Result.Max = v2{ - LerpR32(Panel->SplitPercent, Panel->Bounds.Min.x, Panel->Bounds.Max.x), - Panel->Bounds.Max.y - }; - return Result; + rect2 Result = {}; + Result.Min = Panel->Bounds.Min; + Result.Max = v2{ + LerpR32(Panel->SplitPercent, Panel->Bounds.Min.x, Panel->Bounds.Max.x), + Panel->Bounds.Max.y + }; + return Result; } internal rect2 GetTopPanelBounds(panel* Panel, rect2 PanelBounds) { - rect2 Result = {}; - Result.Min = v2{ - PanelBounds.Min.x, - LerpR32(Panel->SplitPercent, PanelBounds.Min.y, PanelBounds.Max.y) - }; - Result.Max = PanelBounds.Max; - return Result; + rect2 Result = {}; + Result.Min = v2{ + PanelBounds.Min.x, + LerpR32(Panel->SplitPercent, PanelBounds.Min.y, PanelBounds.Max.y) + }; + Result.Max = PanelBounds.Max; + return Result; } internal rect2 GetBottomPanelBounds(panel* Panel, rect2 PanelBounds) { - rect2 Result = {}; - Result.Min = PanelBounds.Min; - Result.Max = v2{ - PanelBounds.Max.x, - LerpR32(Panel->SplitPercent, PanelBounds.Min.y, PanelBounds.Max.y) - }; - return Result; + rect2 Result = {}; + Result.Min = PanelBounds.Min; + Result.Max = v2{ + PanelBounds.Max.x, + LerpR32(Panel->SplitPercent, PanelBounds.Min.y, PanelBounds.Max.y) + }; + return Result; } internal rect2 GetRightPanelBounds(panel* Panel, rect2 PanelBounds) { - rect2 Result = {}; - Result.Min = v2{ - LerpR32(Panel->SplitPercent, PanelBounds.Min.x, PanelBounds.Max.x), - PanelBounds.Min.y - }; - Result.Max = PanelBounds.Max; - return Result; + rect2 Result = {}; + Result.Min = v2{ + LerpR32(Panel->SplitPercent, PanelBounds.Min.x, PanelBounds.Max.x), + PanelBounds.Min.y + }; + Result.Max = PanelBounds.Max; + return Result; } internal rect2 GetLeftPanelBounds(panel* Panel, rect2 PanelBounds) { - rect2 Result = {}; - Result.Min = PanelBounds.Min; - Result.Max = v2{ - LerpR32(Panel->SplitPercent, PanelBounds.Min.x, PanelBounds.Max.x), - PanelBounds.Max.y - }; - return Result; + rect2 Result = {}; + Result.Min = PanelBounds.Min; + Result.Max = v2{ + LerpR32(Panel->SplitPercent, PanelBounds.Min.x, PanelBounds.Max.x), + PanelBounds.Max.y + }; + return Result; } internal void Panel_UpdateLayout(panel* Panel, rect2 Bounds) { - Panel->Bounds = Bounds; - - if (Panel->SplitDirection != PanelSplit_NoSplit) + Panel->Bounds = Bounds; + + if (Panel->SplitDirection != PanelSplit_NoSplit) + { + rect2 LeftOrTopBounds = {}; + rect2 RightOrBottomBounds = {}; + switch (Panel->SplitDirection) { - rect2 LeftOrTopBounds = {}; - rect2 RightOrBottomBounds = {}; - switch (Panel->SplitDirection) - { - case PanelSplit_Horizontal: - { - LeftOrTopBounds = GetTopPanelBounds(Panel); - RightOrBottomBounds = GetBottomPanelBounds(Panel); - } break; - - case PanelSplit_Vertical: - { - LeftOrTopBounds = GetLeftPanelBounds(Panel); - RightOrBottomBounds = GetRightPanelBounds(Panel); - } break; - - InvalidDefaultCase; - } - - Panel_UpdateLayout(Panel->Left, LeftOrTopBounds); - Panel_UpdateLayout(Panel->Right, RightOrBottomBounds); + case PanelSplit_Horizontal: + { + LeftOrTopBounds = GetTopPanelBounds(Panel); + RightOrBottomBounds = GetBottomPanelBounds(Panel); + } break; + + case PanelSplit_Vertical: + { + LeftOrTopBounds = GetLeftPanelBounds(Panel); + RightOrBottomBounds = GetRightPanelBounds(Panel); + } break; + + InvalidDefaultCase; } + + Panel_UpdateLayout(Panel->Left, LeftOrTopBounds); + Panel_UpdateLayout(Panel->Right, RightOrBottomBounds); + } } internal void PanelSystem_UpdateLayout(panel_system* System, rect2 WindowBounds) { - panel* Root = System->Panels; - Panel_UpdateLayout(Root, WindowBounds); + panel* Root = System->Panels; + Panel_UpdateLayout(Root, WindowBounds); } internal panel* GetPanelContainingPoint(panel* Panel, v2 Point) { - panel* Result = 0; - - if (PointIsInRect(Panel->Bounds, Point)) + panel* Result = 0; + + if (PointIsInRect(Panel->Bounds, Point)) + { + switch (Panel->SplitDirection) { - switch (Panel->SplitDirection) + case PanelSplit_NoSplit: + { + Result = Panel; + }break; + + case PanelSplit_Vertical: + case PanelSplit_Horizontal: + {asdfasdfasdfasdfasdf + if (PointIsInRect(Panel->Left->Bounds, Point)) { - case PanelSplit_NoSplit: - { - Result = Panel; - }break; - - case PanelSplit_Vertical: - case PanelSplit_Horizontal: - { - if (PointIsInRect(Panel->Left->Bounds, Point)) - { - Result = GetPanelContainingPoint(Panel->Left, Point); - } - else if (PointIsInRect(Panel->Right->Bounds, Point)) - { - Result = GetPanelContainingPoint(Panel->Right, Point); - } - }break; - - InvalidDefaultCase; + Result = GetPanelContainingPoint(Panel->Left, Point); } + else if (PointIsInRect(Panel->Right->Bounds, Point)) + { + Result = GetPanelContainingPoint(Panel->Right, Point); + } + }break; + + InvalidDefaultCase; } - - return Result; + } + + return Result; } internal panel* PanelSystem_GetPanelContainingPoint(panel_system* System, v2 Point) { - panel* Result = 0; - panel* Root = System->Panels; - Result = GetPanelContainingPoint(Root, Point); - return Result; + panel* Result = 0; + panel* Root = System->Panels; + Result = GetPanelContainingPoint(Root, Point); + return Result; } #define FOLDHAUS_PANEL_H diff --git a/src_v2/editor/lumenarium_editor.cpp b/src_v2/editor/lumenarium_editor.cpp index 4157692..1aba45d 100644 --- a/src_v2/editor/lumenarium_editor.cpp +++ b/src_v2/editor/lumenarium_editor.cpp @@ -131,12 +131,72 @@ ed_load_font_cb(Platform_File_Async_Job_Args result, u8* user_data) platform_texture_update(ui->atlas_texture, ui->atlas.pixels, 1024, 1024, 1024); } +internal void +ed_draw_panel(u8* user_data, BSP_Node_Id id, BSP_Node node, BSP_Area area) +{ + App_State* state = (App_State*)user_data; + UI* ui = &state->editor->ui; + scratch_get(scratch); + + UI_Layout title_layout = {}; + ui_layout_set_row_info(ui, &title_layout); + title_layout.bounds_min = v2{ area.min.x, area.max.y - title_layout.row_height }; + title_layout.bounds_max = area.max; + title_layout.at = title_layout.bounds_min; + + UI_Layout panel_layout = {}; + ui_layout_set_row_info(ui, &panel_layout); + panel_layout.bounds_min = area.min; + panel_layout.bounds_max = v2{ area.max.x, title_layout.bounds_max.y }; + panel_layout.at = panel_layout.bounds_min; + + ui_layout_push(ui, &panel_layout); + + String title = {}; + switch (node.user_data) + { + case 0: + { + title = lit_str("None"); + } break; + + case 1: + { + ed_sculpture_visualizer(state); + title = lit_str("Sculpture"); + } break; + + invalid_default_case; + } + ui_layout_pop(ui); + + ui_layout_push(ui, &title_layout); + UI_Widget_Desc bg = {}; + bg.style.flags = UIWidgetStyle_Bg; + bg.style.color_bg = v4{.4f,.4f,.4f,1}; + bg.style.sprite = WHITE_SPRITE_ID; + bg.string = string_f(scratch.a, "%.*s_%u_title_bg", str_varg(title), id.value); + bg.p_min = title_layout.bounds_min; + bg.p_max = title_layout.bounds_max; + UI_Widget_Result r = ui_widget_push(ui, bg); + ui_layout_row_begin(&title_layout, 4); + { + ui_text(ui, title, BLACK_V4); + } + ui_layout_row_end(&title_layout); + ui_widget_pop(ui, r.id); + ui_layout_pop(ui); +} + internal void ed_init(App_State* state) { Editor* editor = allocator_alloc_struct(permanent, Editor); state->editor = editor; - state->editor->ui = ui_create(4096, 4096, state->input_state, permanent); + editor->ui = ui_create(4096, 4096, state->input_state, permanent); + editor->ui.draw_panel_cb = ed_draw_panel; + editor->ui.draw_panel_cb_data = (u8*)state; + //bsp_split(&editor->ui.panels, editor->ui.panels.root, 700, BSPSplit_YAxis, 0, 1); // make the default quad for us to draw with // TODO(PS): this might be unnecessary with the per-frame buffer we use now @@ -144,6 +204,119 @@ ed_init(App_State* state) platform_file_async_read(lit_str("data/font.ttf"), ed_load_font_cb); + ed_sculpture_visualizer_init(state); +} + +internal void +ed_sculpture_updated(App_State* state, r32 scale, r32 led_size) +{ + Editor* ed = state->editor; + if (!ed) return; + + scratch_get(scratch); + + // NOTE(PS): we need to know the total number of leds in order to give them + // texture coordinates + u32 leds_count = 0; + for (u32 a = 0; a < state->assemblies.len; a++) + { + Assembly_Pixel_Buffer pixels = state->assemblies.pixel_buffers[a]; + leds_count += pixels.len; + } + + // round up to a texture whose sides are powers of two + u32 pixels_dim = (u32)floorf(sqrtf((r32)leds_count)); + pixels_dim = round_up_to_pow2(pixels_dim); + u32 pixels_count = pixels_dim * pixels_dim; + r32 texel_dim = 1 / (r32)pixels_dim; + + // NOTE(PS): Rebuild the sculpture geometry to point to the new + // sculpture. + Geo_Vertex_Buffer_Storage storage = ( + GeoVertexBufferStorage_Position | + GeoVertexBufferStorage_TexCoord + ); + u32 verts_cap = leds_count * 4; + u32 indices_cap = leds_count * 6; + Geo_Quad_Buffer_Builder geo = geo_quad_buffer_builder_create(scratch.a, verts_cap, storage, indices_cap); + r32 r = led_size; + + u32 pixels_created = 0; + for (u32 a = 0; a < state->assemblies.len; a++) + { + Assembly_Pixel_Buffer pixels = state->assemblies.pixel_buffers[a]; + for (u32 p = 0; p < pixels.len; p++) + { + v3 c = pixels.positions[p].xyz; + c *= scale; + + u32 pixel_count = pixels_created++; + u32 pixel_x = pixel_count % pixels_dim; + u32 pixel_y = pixel_count / pixels_dim; + r32 texel_x_min = (r32)pixel_x / (r32)pixels_dim; + r32 texel_y_min = (r32)pixel_y / (r32)pixels_dim; + r32 texel_x_max = texel_x_min + texel_dim; + r32 texel_y_max = texel_y_min + texel_dim; + + v2 t0 = v2{texel_x_min, texel_y_min}; + v2 t1 = v2{texel_x_max, texel_y_min}; + v2 t2 = v2{texel_x_max, texel_y_max}; + v2 t3 = v2{texel_x_min, texel_y_max}; + + v3 p0 = c + v3{ -r, -r, 0 }; + v3 p1 = c + v3{ r, -r, 0 }; + v3 p2 = c + v3{ r, r, 0 }; + v3 p3 = c + v3{ -r, r, 0 }; + geo_quad_buffer_builder_push(&geo, p0, p1, p2, p3, t0, t1, t2, t3); + } + } + + if (ed->sculpture_geo.indices_len != 0) + { + invalid_code_path; + // TODO(PS): destroy the old geometry buffer or update it + } + ed->sculpture_geo = platform_geometry_buffer_create( + geo.buffer_vertex.values, + geo.buffer_vertex.len, + geo.buffer_index.values, + geo.buffer_index.len + ); + + platform_vertex_attrib_pointer( + ed->sculpture_geo, ed->sculpture_shd, 3, ed->sculpture_shd.attrs[0], 5, 0 + ); + platform_vertex_attrib_pointer( + ed->sculpture_geo, ed->sculpture_shd, 2, ed->sculpture_shd.attrs[1], 5, 3 + ); + + // TODO(PS): make this have enough pixels for the sculpture + // TODO(PS): map leds to pixels + + if (ed->sculpture_tex.w != 0) + { + invalid_code_path; + // TODO(PS): destroy the old texture + } + + u32* pixels = allocator_alloc_array(scratch.a, u32, pixels_count); + for (u32 y = 0; y < pixels_dim; y++) + { + for (u32 x = 0; x < pixels_dim; x++) + { + r32 rp = (r32)y / (r32)pixels_dim; + r32 bp = (r32)x / (r32)pixels_dim; + u8 rb = (u8)(255 * rp); + u8 bb = (u8)(255 * bp); + u32 c = ( + 0xFF0000FF | + (rb << 8) | + (bb << 16) + ); + pixels[(y * pixels_dim) + x] = c; + } + } + ed->sculpture_tex = platform_texture_create((u8*)pixels, pixels_dim, pixels_dim, pixels_dim); } internal void @@ -152,59 +325,11 @@ ed_frame_prepare(App_State* state) ui_frame_prepare(&state->editor->ui, state->editor->window_dim); } -global r32 p = 0.3f; - internal void ed_frame(App_State* state) { UI* ui = &state->editor->ui; - UI_Layout layout = {}; - layout.bounds_min = v2{ 500, 200 }; - layout.bounds_max = v2{ 700, 500 }; - ui_layout_set_row_info(ui, &layout); - layout.at = layout.bounds_min; - ui_layout_push(ui, &layout); - - ui_text_f(ui, "Hi there! %d", 1000); - show = ui_toggle(ui, lit_str("my toggle"), show); - if (show) - { - ui_layout_row_begin(ui, 2); - { - ui_button(ui, lit_str("Sup")); - ui_button(ui, lit_str("you there")); - } - ui_layout_row_end(ui); - } - ui_button(ui, lit_str("Hi there my good sir")); - - ui_scroll_view_begin(ui, lit_str("scroll area"), v2{800, 200}, v2{1000,500}, 8); - { - ui_button(ui, lit_str("Sup")); - ui_button(ui, lit_str("you there")); - ui_button(ui, lit_str("Sup")); - ui_button(ui, lit_str("you there")); - - ui_button(ui, lit_str("Sup")); - ui_button(ui, lit_str("you there")); - ui_button(ui, lit_str("Sup")); - ui_button(ui, lit_str("you there")); - - ui_button(ui, lit_str("Sup")); - ui_button(ui, lit_str("you there")); - ui_button(ui, lit_str("Sup")); - ui_button(ui, lit_str("you there")); - - ui_button(ui, lit_str("Sup")); - ui_button(ui, lit_str("you there")); - ui_button(ui, lit_str("Sup")); - ui_button(ui, lit_str("I'm lastf;")); - } - ui_scroll_view_end(ui); - - ui_layout_pop(ui); - edr_render_begin(state); ui_draw(&state->editor->ui); edr_render(state); diff --git a/src_v2/editor/lumenarium_editor.h b/src_v2/editor/lumenarium_editor.h index 9cd17c2..b623912 100644 --- a/src_v2/editor/lumenarium_editor.h +++ b/src_v2/editor/lumenarium_editor.h @@ -8,6 +8,16 @@ struct Editor v2 window_dim; Editor_Renderer renderer; UI ui; + + v3 camera_pos; + + Platform_Geometry_Buffer sculpture_geo; + Platform_Shader sculpture_shd; + Platform_Texture sculpture_tex; }; +// NOTE(PS): call this any time sculpture data is updated if +// you want to see the sculpture in the visualizer +internal void ed_sculpture_updated(App_State* state); + #endif //LUMENARIUM_EDITOR_H diff --git a/src_v2/editor/lumenarium_editor_sculpture_visualizer.cpp b/src_v2/editor/lumenarium_editor_sculpture_visualizer.cpp new file mode 100644 index 0000000..8a0de1d --- /dev/null +++ b/src_v2/editor/lumenarium_editor_sculpture_visualizer.cpp @@ -0,0 +1,100 @@ + +static String sculpture_shd_vert_win32 = lit_str( + "#version 330 core\n" + "layout (location = 0) in vec3 a_pos;\n" + "layout (location = 1) in vec2 a_uv;\n" + "out vec2 uv;\n" + "uniform mat4 proj;\n" + "void main(void) {\n" + " gl_Position = proj * vec4(a_pos, 1.0);\n" + " uv = a_uv;\n" + "}" + ); + +static String sculpture_shd_vert_wasm = lit_str( + "precision highp float;\n" + "attribute vec3 a_pos;\n" + "attribute vec2 a_uv;\n" + "varying vec2 uv;\n" + "uniform mat4 proj;\n" + "void main(void) {\n" + " gl_Position = proj * vec4(a_pos, 1.0);\n" + " uv = a_uv;\n" + "}" + ); + +static String sculpture_shd_frag_win32 = lit_str( + "#version 330 core\n" + "in vec2 uv;\n" + "out vec4 FragColor;\n" + "uniform sampler2D texture;\n" + "void main(void) {\n" + " FragColor = texture(texture, uv);\n" + "}" + ); + +static String sculpture_shd_frag_wasm = lit_str( + "precision highp float;\n" + "varying vec2 uv;\n" + "uniform sampler2D texture;\n" + "void main(void) {\n" + " //gl_FragColor = texture2D(texture, uv) * color;\n" + " gl_FragColor = vec4(uv.x,1,uv.y,1);\n" + "}" + ); + +internal void +ed_sculpture_visualizer_init(App_State* state) +{ + Editor* editor = state->editor; + + +#if defined(PLATFORM_win32) + String vert = sculpture_shd_vert_win32; + String frag = sculpture_shd_frag_win32; +#elif defined(PLATFORM_wasm) + String vert = sculpture_shd_vert_wasm; + String frag = sculpture_shd_frag_wasm; +#endif + + String attrs[] = { lit_str("a_pos"), lit_str("a_uv") }; + String uniforms[] = { lit_str("proj") }; + editor->sculpture_shd = platform_shader_create( + vert, frag, attrs, 2, uniforms, 1 + ); +} + +r32 cam_theta = 0; + +internal void +ed_sculpture_visualizer(App_State* state) +{ + Editor* ed = state->editor; + + // Set the viewport to the current layout's region so that the sculpture + // never overlaps any other ui elements + UI_Layout l = *ed->ui.layout; + v2 view_dim = l.bounds_max - l.bounds_min; + glViewport( + (s32)l.bounds_min.x, + (s32)l.bounds_min.y, + (s32)view_dim.x, + (s32)view_dim.y + ); + + // TODO(PS): TEMPORARY CAMERA CODE + cam_theta += 0.05f; + v3 camera_pos = v3{sinf(cam_theta) * 50, 0, cosf(cam_theta) * 50}; + r32 aspect = view_dim.x / view_dim.y; + m44 proj = HMM_Perspective(45.0, aspect, 0.01f, 500); + m44 view = HMM_LookAt(camera_pos, v3{0,0,0}, v3{0,1,0}); + + platform_shader_bind(ed->sculpture_shd); + platform_set_uniform(ed->sculpture_shd, 0, proj * view); + platform_texture_bind(ed->sculpture_tex); + platform_geometry_bind(ed->sculpture_geo); + platform_geometry_draw(ed->sculpture_geo, ed->sculpture_geo.indices_len); + + // reset the viewport for all other rendering + glViewport(0, 0, (s32)ed->window_dim.x, (s32)ed->window_dim.y); +} \ No newline at end of file diff --git a/src_v2/editor/lumenarium_editor_ui.cpp b/src_v2/editor/lumenarium_editor_ui.cpp index 08985c1..44bccc5 100644 --- a/src_v2/editor/lumenarium_editor_ui.cpp +++ b/src_v2/editor/lumenarium_editor_ui.cpp @@ -2,19 +2,34 @@ static String ui_shader_vert_win32 = lit_str( "#version 330 core\n" - "layout (location = 0) in vec4 a_pos;\n" + "layout (location = 0) in vec3 a_pos;\n" "layout (location = 1) in vec2 a_uv;\n" "layout (location = 2) in vec4 a_color;\n" "out vec2 uv;\n" "out vec4 color;\n" "uniform mat4 proj;\n" "void main(void) {\n" - " gl_Position = proj * a_pos;\n" + " gl_Position = proj * vec4(a_pos, 1.0);\n" " uv = a_uv;\n" " color = a_color;\n" "}" ); +static String ui_shader_vert_wasm = lit_str( + "precision highp float;\n" + "attribute vec3 a_pos;\n" + "attribute vec2 a_uv;\n" + "attribute vec4 a_color;\n" + "varying vec2 uv;\n" + "varying vec4 color;\n" + "uniform mat4 proj;\n" + "void main(void) {\n" + " gl_Position = proj * vec4(a_pos, 1.0);\n" + " uv = a_uv;\n" + " color = a_color;\n" + "}" + ); + static String ui_shader_frag_win32 = lit_str( "#version 330 core\n" "in vec2 uv;\n" @@ -26,10 +41,21 @@ static String ui_shader_frag_win32 = lit_str( "}" ); +static String ui_shader_frag_wasm = lit_str( + "precision highp float;\n" + "varying vec2 uv;\n" + "varying vec4 color;\n" + "uniform sampler2D texture;\n" + "void main(void) {\n" + " gl_FragColor = texture2D(texture, uv) * color;\n" + "}" + ); + internal UI ui_create(u32 widget_pool_cap, u32 verts_cap, Input_State* input, Allocator* a) { UI result = {}; + zero_struct(result); result.input = input; // Widgets @@ -39,36 +65,46 @@ ui_create(u32 widget_pool_cap, u32 verts_cap, Input_State* input, Allocator* a) result.widgets.states = allocator_alloc_array(a, UI_Widget_State, result.widgets.states_cap); result.widgets.states_hash = allocator_alloc_array(a, u32, result.widgets.states_cap); - // Per Frame Vertex Buffer - result.verts_cap = verts_cap; - result.verts = allocator_alloc_array(a, UI_Vertex, verts_cap); - result.indices_cap = verts_cap * 2; - result.indices = allocator_alloc_array(a, u32, result.indices_cap); + result.panels = bsp_create(a, 32); + result.panels.root = bsp_push(&result.panels, {0}, {v2{},v2{1400, 800}}, 1); + + // Per Frame Vertex Buffer + Geo_Vertex_Buffer_Storage storage = ( + GeoVertexBufferStorage_Position | + GeoVertexBufferStorage_TexCoord | + GeoVertexBufferStorage_Color + ); + result.geo = geo_quad_buffer_builder_create(a, verts_cap, storage, verts_cap * 2); result.per_frame_buffer = platform_geometry_buffer_create( - (r32*)result.verts, - result.verts_cap, - result.indices, - result.indices_cap + result.geo.buffer_vertex.values, + result.geo.buffer_vertex.cap, + result.geo.buffer_index.values, + result.geo.buffer_index.cap ); +#if defined(PLATFORM_win32) + String vert = ui_shader_vert_win32; + String frag = ui_shader_frag_win32; +#elif defined(PLATFORM_wasm) + String vert = ui_shader_vert_wasm; + String frag = ui_shader_frag_wasm; +#endif + String attrs[] = { lit_str("a_pos"), lit_str("a_uv"), lit_str("a_color") }; String uniforms[] = { lit_str("proj") }; result.shader = platform_shader_create( - ui_shader_vert_win32, - ui_shader_frag_win32, - attrs, 3, - uniforms, 1 + vert, frag, attrs, 3, uniforms, 1 ); platform_vertex_attrib_pointer( - result.per_frame_buffer, result.shader, 4, result.shader.attrs[0], 10, 0 + result.per_frame_buffer, result.shader, 3, result.shader.attrs[0], 9, 0 ); platform_vertex_attrib_pointer( - result.per_frame_buffer, result.shader, 2, result.shader.attrs[1], 10, 4 + result.per_frame_buffer, result.shader, 2, result.shader.attrs[1], 9, 3 ); platform_vertex_attrib_pointer( - result.per_frame_buffer, result.shader, 4, result.shader.attrs[2], 10, 6 + result.per_frame_buffer, result.shader, 4, result.shader.attrs[2], 9, 5 ); // Texture Atlas @@ -87,41 +123,18 @@ ui_create(u32 widget_pool_cap, u32 verts_cap, Input_State* input, Allocator* a) return result; } -internal u32 -ui_vert_push(UI* ui, v3 p, v2 t, v4 c) -{ - assert(ui->verts_len < ui->verts_cap); - u32 index = ui->verts_len++; - - ui->verts[index].pos = {p.x, p.y, p.z, 1}; - ui->verts[index].uv = t; - ui->verts[index].color = c; - - return index; -} - -internal void -ui_index_push(UI* ui, u32 i) -{ - assert(ui->indices_len < ui->indices_cap); - ui->indices[ui->indices_len++] = i; -} - internal void ui_quad_push(UI* ui, v3 pmin, v3 pmax, v2 tmin, v2 tmax, v4 c) { - u32 bl = ui_vert_push(ui, pmin, tmin, c); - u32 br = ui_vert_push(ui, v3{pmax.x, pmin.y, pmin.z}, v2{tmax.x,tmin.y}, c); - u32 tr = ui_vert_push(ui, pmax, tmax, c); - u32 tl = ui_vert_push(ui, v3{pmin.x, pmax.y, pmin.z}, v2{tmin.x,tmax.y}, c); - - ui_index_push(ui, bl); - ui_index_push(ui, br); - ui_index_push(ui, tr); - - ui_index_push(ui, bl); - ui_index_push(ui, tr); - ui_index_push(ui, tl); + v3 p0 = pmin; + v3 p1 = v3{pmax.x, pmin.y, pmin.z}; + v3 p2 = pmax; + v3 p3 = v3{pmin.x, pmax.y, pmin.z}; + v2 t0 = tmin; + v2 t1 = v2{tmax.x,tmin.y}; + v2 t2 = tmax; + v2 t3 = v2{tmin.x,tmax.y}; + geo_quad_buffer_builder_push(&ui->geo, p0, p1, p2, p3, t0, t1, t2, t3, c); } internal void @@ -159,6 +172,7 @@ internal UI_Char_Draw_Cmd ui_sprite_char_get_draw_cmd(UI* ui, v3 at, u32 codepoint) { UI_Char_Draw_Cmd result = {}; + zero_struct(result); Texture_Atlas_Sprite sprite = texture_atlas_sprite_get(&ui->atlas, codepoint); result.uv = texture_atlas_sprite_get_uvs(&ui->atlas, sprite); @@ -181,14 +195,23 @@ ui_sprite_char_get_draw_cmd(UI* ui, v3 at, u32 codepoint) internal void ui_frame_prepare(UI* ui, v2 window_dim) { - ui->verts_len = 0; - ui->indices_len = 0; + ui->geo.buffer_vertex.len = 0; + ui->geo.buffer_index.len = 0; ui->widgets.free_len = 0; ui->widgets.active_parent = 0; ui->widgets.root = ui_widget_pool_push(&ui->widgets, lit_str("root")); ui->widgets.active_parent = ui->widgets.root; + BSP_Node* panel_root = bsp_get(&ui->panels, ui->panels.root); + if (window_dim.x != 0 && window_dim.y != 0 && window_dim != panel_root->area.max) + { + BSP_Area area = {}; + area.min = v2{0,0}; + area.max = window_dim; + bsp_node_area_update(&ui->panels, ui->panels.root, area); + } + v2 half_d = window_dim * 0.5f; ui->proj = HMM_Orthographic(0, window_dim.x, window_dim.y, 0, 0.01f, 100); @@ -206,9 +229,42 @@ ui_frame_prepare(UI* ui, v2 window_dim) global bool show = false; +internal void +ui_draw_panel(BSP* tree, BSP_Node_Id id, BSP_Node* node, u8* user_data) +{ + if (node->split.kind != BSPSplit_None) return; + UI* ui = (UI*)user_data; + BSP_Area area = node->area; + + if (ui->draw_panel_cb) ui->draw_panel_cb(ui->draw_panel_cb_data, id, *node, area); + + r32 z = -1; + v3 l0p0 = v3{ area.min.x, area.min.y, z }; // left side + v3 l0p1 = v3{ area.min.x + 1, area.max.y, z }; + v3 l1p0 = v3{ area.max.x - 1, area.min.y, z }; // right side + v3 l1p1 = v3{ area.max.x, area.max.y, z }; + v3 l2p0 = v3{ area.min.x, area.min.y , z }; // bottom side + v3 l2p1 = v3{ area.max.x, area.min.y + 1, z }; + v3 l3p0 = v3{ area.min.x, area.max.y , z }; // top side + v3 l3p1 = v3{ area.max.x, area.max.y + 1, z }; + u32 sid = WHITE_SPRITE_ID; + v4 c = WHITE_V4; + if (rect2_contains(area.min, area.max, ui->input->frame_hot->mouse_pos)) + { + c = PINK_V4; + } + + ui_sprite_push(ui, l0p0, l0p1, sid, c); + ui_sprite_push(ui, l1p0, l1p1, sid, c); + ui_sprite_push(ui, l2p0, l2p1, sid, c); + ui_sprite_push(ui, l3p0, l3p1, sid, c); +} + internal void ui_draw(UI* ui) { + bsp_walk_inorder(&ui->panels, ui->panels.root, ui_draw_panel, (u8*)ui); + u32 widget_count = ui->widgets.free_len; r32 range_min = -10; r32 range_max = -1; @@ -217,20 +273,18 @@ ui_draw(UI* ui) platform_geometry_buffer_update( &ui->per_frame_buffer, - (r32*)ui->verts, + (r32*)ui->geo.buffer_vertex.values, 0, - ui->verts_len * 10, - ui->indices, + ui->geo.buffer_vertex.len * ui->geo.buffer_vertex.stride, + ui->geo.buffer_index.values, 0, - ui->indices_len + ui->geo.buffer_index.len ); platform_shader_bind(ui->shader); platform_set_uniform(ui->shader, 0, ui->proj); platform_texture_bind(ui->atlas_texture); platform_geometry_bind(ui->per_frame_buffer); - platform_geometry_draw(ui->per_frame_buffer, ui->indices_len); - - OutputDebugStringA("Frame\n\n"); + platform_geometry_draw(ui->per_frame_buffer, ui->geo.buffer_index.len); } //////////////////////////////////////////// @@ -241,6 +295,7 @@ ui_widget_id_create(String string, u32 index) { assert(string.len != 0 && string.str != 0); UI_Widget_Id result = {}; + zero_struct(result); result.value = hash_djb2_to_u32(string); result.index = index; return result; @@ -272,7 +327,11 @@ ui_widget_pool_push(UI_Widget_Pool* pool, String string) result->child_first = 0; result->child_last = 0; - u32 index = hash_table_register(pool->states_hash, pool->states_cap, result->id.value); + u32 index = hash_table_find(pool->states_hash, pool->states_cap, result->id.value); + if (index == pool->states_cap) + { + index = hash_table_register(pool->states_hash, pool->states_cap, result->id.value); + } assert(index != pool->states_cap); UI_Widget_State* state = pool->states + index; zero_struct(*state); @@ -286,6 +345,7 @@ ui_widget_pool_push(UI_Widget_Pool* pool, String string) result ); } + pool->active_parent = result; return result; } @@ -337,6 +397,7 @@ internal UI_Widget_Result ui_widget_push(UI* ui, UI_Widget_Desc desc) { UI_Widget_Result result = {}; + zero_struct(result); v2 dim = desc.p_max - desc.p_min; if (dim.x == 0 || dim.y == 0) return result; @@ -427,9 +488,10 @@ ui_widget_push(UI* ui, UI_Widget_Desc desc) } internal void -ui_widget_pop(UI* ui, UI_Widget* widget) +ui_widget_pop(UI* ui, UI_Widget_Id widget_id) { - assert(ui_widget_id_equals(widget->id, ui->widgets.active_parent->id)); + if (!ui_widget_id_is_valid(widget_id)) return; + assert(ui_widget_id_equals(widget_id, ui->widgets.active_parent->id)); ui_widget_pool_pop(&ui->widgets); } @@ -475,7 +537,9 @@ ui_widgets_to_geometry_recursive(UI* ui, UI_Widget* widget, r32 z_start, r32 z_s if (has_flag(child->desc.style.flags, (UIWidgetStyle_FillH | UIWidgetStyle_FillV))) { v3 fill_min = {}; + zero_struct(fill_min); v3 fill_max = {}; + zero_struct(fill_max); if (has_flag(child->desc.style.flags, UIWidgetStyle_FillH)) { r32 fill_x = HMM_Lerp(bg_min.x, child->desc.fill_pct.x, bg_max.x); @@ -523,6 +587,7 @@ ui_widgets_to_geometry_recursive(UI* ui, UI_Widget* widget, r32 z_start, r32 z_s { u8 at = child->desc.string.str[i]; UI_Char_Draw_Cmd cmd = {}; + zero_struct(cmd); if (!char_is_space(at)) { cmd = ui_sprite_char_get_draw_cmd(ui, baseline, (u32)at); @@ -616,8 +681,9 @@ internal UI_Layout_Bounds ui_layout_get_next(UI_Layout* layout) { UI_Layout_Bounds result = {}; + zero_struct(result); if (layout->at.x >= layout->bounds_max.x || layout->at.y >= layout->bounds_max.y || - layout->at.y + layout->row_height >= layout->bounds_max.y) + layout->at.y + layout->row_height > layout->bounds_max.y) { return result; } @@ -653,8 +719,8 @@ ui_layout_get_next(UI_Layout* layout) if (result.min.x < layout->bounds_min.x || result.min.y < layout->bounds_min.y || result.max.x < layout->bounds_min.x || result.max.y < layout->bounds_min.y) { - result.min = {}; - result.max = {}; + zero_struct(result.min); + zero_struct(result.max); } return result; @@ -716,26 +782,40 @@ ui_layout_next_widget(UI* ui, UI_Widget_Kind kind) { UI_Layout_Bounds b = ui_layout_get_next(ui); UI_Widget_Desc d = {}; + zero_struct(d); d.p_min = b.min; d.p_max = b.max; d.style = ui_get_style(ui, kind); return d; } +internal void +ui_text(UI* ui, String string, v4 color) +{ + UI_Widget_Desc d = ui_layout_next_widget(ui, UIWidget_Text); + d.string = string; + d.style.color_fg = color; + UI_Widget_Result r = ui_widget_push(ui, d); + ui_widget_pop(ui, r.id); +} + internal void ui_text(UI* ui, String string) { UI_Widget_Desc d = ui_layout_next_widget(ui, UIWidget_Text); d.string = string; - ui_widget_push(ui, d); + UI_Widget_Result r = ui_widget_push(ui, d); + ui_widget_pop(ui, r.id); } internal void ui_text_f(UI* ui, char* fmt, ...) { + scratch_get(scratch); + va_list args; va_start(args, fmt); - String string = string_fv(scratch, fmt, args); + String string = string_fv(scratch.a, fmt, args); va_end(args); return ui_text(ui, string); @@ -747,6 +827,7 @@ ui_button(UI* ui, String string) UI_Widget_Desc d = ui_layout_next_widget(ui, UIWidget_Button); d.string = string; UI_Widget_Result r = ui_widget_push(ui, d); + ui_widget_pop(ui, r.id); return has_flag(r.flags, UIWidgetResult_MouseLeft_WentUp); } @@ -761,6 +842,7 @@ ui_toggle(UI* ui, String string, bool value) } d.string = string; UI_Widget_Result r = ui_widget_push(ui, d); + ui_widget_pop(ui, r.id); bool result = value; if (has_flag(r.flags, UIWidgetResult_MouseLeft_WentUp)) result = !result; return result; @@ -769,6 +851,8 @@ ui_toggle(UI* ui, String string, bool value) internal UI_Layout* ui_scroll_view_begin(UI* ui, String string, v2 bounds_min, v2 bounds_max, u32 rows) { + scratch_get(scratch); + r32 scroll_bar_dim = 15; v2 scroll_bars_area = v2{0, 0}; v2 scroll_area_min = bounds_min; @@ -776,6 +860,7 @@ ui_scroll_view_begin(UI* ui, String string, v2 bounds_min, v2 bounds_max, u32 ro v2 scroll_area_dim = scroll_area_max - scroll_area_min; v2 scroll_offset = {}; + zero_struct(scroll_offset); r32 rows_avail = floorf(scroll_area_dim.y / ui->layout->row_height); if (rows > rows_avail) { @@ -785,11 +870,13 @@ ui_scroll_view_begin(UI* ui, String string, v2 bounds_min, v2 bounds_max, u32 ro scroll_area_dim = scroll_area_max - scroll_area_min; UI_Widget_Desc vscroll_d = {}; + zero_struct(vscroll_d); vscroll_d.p_min = { bounds_max.x - scroll_bar_dim, bounds_min.y }; vscroll_d.p_max = { bounds_max.x, bounds_max.y }; vscroll_d.style = ui_get_style(ui, UIWidget_VScroll); - vscroll_d.string = string_f(scratch, "%.*s_vscroll", str_varg(string)); + vscroll_d.string = string_f(scratch.a, "%.*s_vscroll", str_varg(string)); UI_Widget_Result r = ui_widget_push(ui, vscroll_d); + ui_widget_pop(ui, r.id); UI_Widget_State* vscroll_state = ui_widget_state_get(ui, r.id); scroll_offset.y = vscroll_state->scroll.y; @@ -800,7 +887,7 @@ ui_scroll_view_begin(UI* ui, String string, v2 bounds_min, v2 bounds_max, u32 ro scroll_offset *= v2{ 0, y_scroll_dist }; - UI_Layout* layout = allocator_alloc_struct(scratch, UI_Layout); + UI_Layout* layout = allocator_alloc_struct(scratch.a, UI_Layout); layout->mode = UILayout_Columns; layout->bounds_min = scroll_area_min; layout->bounds_max = scroll_area_max; diff --git a/src_v2/editor/lumenarium_editor_ui.h b/src_v2/editor/lumenarium_editor_ui.h index 4e53539..6a9b4e7 100644 --- a/src_v2/editor/lumenarium_editor_ui.h +++ b/src_v2/editor/lumenarium_editor_ui.h @@ -165,15 +165,11 @@ struct UI_Layout_Bounds v2 max; }; +typedef void UI_Draw_Panel_Cb(u8* user_data, BSP_Node_Id id, BSP_Node node, BSP_Area area); + struct UI { - UI_Vertex* verts; - u32 verts_len; - u32 verts_cap; - - u32* indices; - u32 indices_len; - u32 indices_cap; + Geo_Quad_Buffer_Builder geo; Texture_Atlas atlas; r32 font_ascent, font_descent, font_line_gap, font_space_width; @@ -186,6 +182,10 @@ struct UI UI_Layout* layout; + BSP panels; + UI_Draw_Panel_Cb* draw_panel_cb; + u8* draw_panel_cb_data; + // frames since these values were set u16 widget_next_hot_frames; u16 widget_hot_frames; @@ -206,7 +206,7 @@ internal void ui_sprite_register(UI* ui, u8* pixels, u32 w, u32 h, u32 id); internal void ui_sprite_push(UI* ui, v3 pmin, v3 pmax, u32 id, v4 color); internal void ui_sprite_push(UI* ui, v3 pmin, v3 pmax, u32 id); internal v3 ui_sprite_char_push(UI* ui, v2 at, u32 codepoint, v4 color); -internal void ui_draw(UI* ui); +internal void ui_draw(App_State* state); // Widgets @@ -223,7 +223,7 @@ internal UI_Widget* ui_widget_pool_push(UI_Widget_Pool* pool, String string); internal void ui_widget_pool_pop(UI_Widget_Pool* pool); internal UI_Widget_Result ui_widget_push(UI* ui, UI_Widget_Desc desc); -internal void ui_widget_pop(UI* ui, UI_Widget* widget); +internal void ui_widget_pop(UI* ui, UI_Widget_Id widget_id); internal r32 ui_widgets_to_geometry_recursive(UI* ui, UI_Widget* widget, r32 z_start, r32 z_step); diff --git a/src_v2/engine/lumenarium_engine.cpp b/src_v2/engine/lumenarium_engine.cpp index 2f9bb08..93f3e1e 100644 --- a/src_v2/engine/lumenarium_engine.cpp +++ b/src_v2/engine/lumenarium_engine.cpp @@ -18,7 +18,7 @@ en_frame_prepare(App_State* state) internal void en_frame(App_State* state) { - +#if 0 /////////////////////////////////////// // Output Data @@ -65,6 +65,7 @@ en_frame(App_State* state) invalid_code_path; } } +#endif } internal void diff --git a/src_v2/engine/lumenarium_engine_assembly.cpp b/src_v2/engine/lumenarium_engine_assembly.cpp index 1e58678..156b3fc 100644 --- a/src_v2/engine/lumenarium_engine_assembly.cpp +++ b/src_v2/engine/lumenarium_engine_assembly.cpp @@ -100,3 +100,22 @@ assembly_add_led( assert(strip->pixels_len < strip->pixels_cap); strip->pixels[strip->pixels_len++] = pixel_index; } + +void +assembly_strip_create_leds( + Assembly_Array* a, + Assembly_Handle h, + Assembly_Strip* strip, + v3 start, v3 end, + u32 led_count + ){ + v3 delta_total = end - start; + v3 delta_step = delta_total / (r32)led_count; + + for (u32 i = 0; i < led_count; i++) + { + v4 pos = {0,0,0,1}; + pos.XYZ = start + ((r32)i * delta_step); + assembly_add_led(a, h, strip, pos); + } +} \ No newline at end of file diff --git a/src_v2/libs/stb_sprintf.h b/src_v2/libs/stb_sprintf.h new file mode 100644 index 0000000..64bce7e --- /dev/null +++ b/src_v2/libs/stb_sprintf.h @@ -0,0 +1,1906 @@ +// stb_sprintf - v1.10 - public domain snprintf() implementation +// originally by Jeff Roberts / RAD Game Tools, 2015/10/20 +// http://github.com/nothings/stb +// +// allowed types: sc uidBboXx p AaGgEef n +// lengths : hh h ll j z t I64 I32 I +// +// Contributors: +// Fabian "ryg" Giesen (reformatting) +// github:aganm (attribute format) +// +// Contributors (bugfixes): +// github:d26435 +// github:trex78 +// github:account-login +// Jari Komppa (SI suffixes) +// Rohit Nirmal +// Marcin Wojdyr +// Leonard Ritter +// Stefano Zanotti +// Adam Allison +// Arvid Gerstmann +// Markus Kolb +// +// LICENSE: +// +// See end of file for license information. + +#ifndef STB_SPRINTF_H_INCLUDE +#define STB_SPRINTF_H_INCLUDE + +/* +Single file sprintf replacement. + +Originally written by Jeff Roberts at RAD Game Tools - 2015/10/20. +Hereby placed in public domain. + +This is a full sprintf replacement that supports everything that +the C runtime sprintfs support, including float/double, 64-bit integers, +hex floats, field parameters (%*.*d stuff), length reads backs, etc. + +Why would you need this if sprintf already exists? Well, first off, +it's *much* faster (see below). It's also much smaller than the CRT +versions code-space-wise. We've also added some simple improvements +that are super handy (commas in thousands, callbacks at buffer full, +for example). Finally, the format strings for MSVC and GCC differ +for 64-bit integers (among other small things), so this lets you use +the same format strings in cross platform code. + +It uses the standard single file trick of being both the header file +and the source itself. If you just include it normally, you just get +the header file function definitions. To get the code, you include +it from a C or C++ file and define STB_SPRINTF_IMPLEMENTATION first. + +It only uses va_args macros from the C runtime to do it's work. It +does cast doubles to S64s and shifts and divides U64s, which does +drag in CRT code on most platforms. + +It compiles to roughly 8K with float support, and 4K without. +As a comparison, when using MSVC static libs, calling sprintf drags +in 16K. + +API: +==== +int stbsp_sprintf( char * buf, char const * fmt, ... ) +int stbsp_snprintf( char * buf, int count, char const * fmt, ... ) + Convert an arg list into a buffer. stbsp_snprintf always returns + a zero-terminated string (unlike regular snprintf). + +int stbsp_vsprintf( char * buf, char const * fmt, va_list va ) +int stbsp_vsnprintf( char * buf, int count, char const * fmt, va_list va ) + Convert a va_list arg list into a buffer. stbsp_vsnprintf always returns + a zero-terminated string (unlike regular snprintf). + +int stbsp_vsprintfcb( STBSP_SPRINTFCB * callback, void * user, char * buf, char const * fmt, va_list va ) + typedef char * STBSP_SPRINTFCB( char const * buf, void * user, int len ); + Convert into a buffer, calling back every STB_SPRINTF_MIN chars. + Your callback can then copy the chars out, print them or whatever. + This function is actually the workhorse for everything else. + The buffer you pass in must hold at least STB_SPRINTF_MIN characters. + // you return the next buffer to use or 0 to stop converting + +void stbsp_set_separators( char comma, char period ) + Set the comma and period characters to use. + +FLOATS/DOUBLES: +=============== +This code uses a internal float->ascii conversion method that uses +doubles with error correction (double-doubles, for ~105 bits of +precision). This conversion is round-trip perfect - that is, an atof +of the values output here will give you the bit-exact double back. + +One difference is that our insignificant digits will be different than +with MSVC or GCC (but they don't match each other either). We also +don't attempt to find the minimum length matching float (pre-MSVC15 +doesn't either). + +If you don't need float or doubles at all, define STB_SPRINTF_NOFLOAT +and you'll save 4K of code space. + +64-BIT INTS: +============ +This library also supports 64-bit integers and you can use MSVC style or +GCC style indicators (%I64d or %lld). It supports the C99 specifiers +for size_t and ptr_diff_t (%jd %zd) as well. + +EXTRAS: +======= +Like some GCCs, for integers and floats, you can use a ' (single quote) +specifier and commas will be inserted on the thousands: "%'d" on 12345 +would print 12,345. + +For integers and floats, you can use a "$" specifier and the number +will be converted to float and then divided to get kilo, mega, giga or +tera and then printed, so "%$d" 1000 is "1.0 k", "%$.2d" 2536000 is +"2.53 M", etc. For byte values, use two $:s, like "%$$d" to turn +2536000 to "2.42 Mi". If you prefer JEDEC suffixes to SI ones, use three +$:s: "%$$$d" -> "2.42 M". To remove the space between the number and the +suffix, add "_" specifier: "%_$d" -> "2.53M". + +In addition to octal and hexadecimal conversions, you can print +integers in binary: "%b" for 256 would print 100. + +PERFORMANCE vs MSVC 2008 32-/64-bit (GCC is even slower than MSVC): +=================================================================== +"%d" across all 32-bit ints (4.8x/4.0x faster than 32-/64-bit MSVC) +"%24d" across all 32-bit ints (4.5x/4.2x faster) +"%x" across all 32-bit ints (4.5x/3.8x faster) +"%08x" across all 32-bit ints (4.3x/3.8x faster) +"%f" across e-10 to e+10 floats (7.3x/6.0x faster) +"%e" across e-10 to e+10 floats (8.1x/6.0x faster) +"%g" across e-10 to e+10 floats (10.0x/7.1x faster) +"%f" for values near e-300 (7.9x/6.5x faster) +"%f" for values near e+300 (10.0x/9.1x faster) +"%e" for values near e-300 (10.1x/7.0x faster) +"%e" for values near e+300 (9.2x/6.0x faster) +"%.320f" for values near e-300 (12.6x/11.2x faster) +"%a" for random values (8.6x/4.3x faster) +"%I64d" for 64-bits with 32-bit values (4.8x/3.4x faster) +"%I64d" for 64-bits > 32-bit values (4.9x/5.5x faster) +"%s%s%s" for 64 char strings (7.1x/7.3x faster) +"...512 char string..." ( 35.0x/32.5x faster!) +*/ + +#if defined(__clang__) +#if defined(__has_feature) && defined(__has_attribute) +#if __has_feature(address_sanitizer) +#if __has_attribute(__no_sanitize__) +#define STBSP__ASAN __attribute__((__no_sanitize__("address"))) +#elif __has_attribute(__no_sanitize_address__) +#define STBSP__ASAN __attribute__((__no_sanitize_address__)) +#elif __has_attribute(__no_address_safety_analysis__) +#define STBSP__ASAN __attribute__((__no_address_safety_analysis__)) +#endif +#endif +#endif +#elif defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) +#if defined(__SANITIZE_ADDRESS__) && __SANITIZE_ADDRESS__ +#define STBSP__ASAN __attribute__((__no_sanitize_address__)) +#endif +#endif + +#ifndef STBSP__ASAN +#define STBSP__ASAN +#endif + +#ifdef STB_SPRINTF_STATIC +#define STBSP__PUBLICDEC static +#define STBSP__PUBLICDEF static STBSP__ASAN +#else +#ifdef __cplusplus +#define STBSP__PUBLICDEC extern "C" +#define STBSP__PUBLICDEF extern "C" STBSP__ASAN +#else +#define STBSP__PUBLICDEC extern +#define STBSP__PUBLICDEF STBSP__ASAN +#endif +#endif + +#if defined(__has_attribute) +#if __has_attribute(format) +#define STBSP__ATTRIBUTE_FORMAT(fmt,va) __attribute__((format(printf,fmt,va))) +#endif +#endif + +#ifndef STBSP__ATTRIBUTE_FORMAT +#define STBSP__ATTRIBUTE_FORMAT(fmt,va) +#endif + +#ifdef _MSC_VER +#define STBSP__NOTUSED(v) (void)(v) +#else +#define STBSP__NOTUSED(v) (void)sizeof(v) +#endif + +#include // for va_arg(), va_list() +#include // size_t, ptrdiff_t + +#ifndef STB_SPRINTF_MIN +#define STB_SPRINTF_MIN 512 // how many characters per callback +#endif +typedef char *STBSP_SPRINTFCB(const char *buf, void *user, int len); + +#ifndef STB_SPRINTF_DECORATE +#define STB_SPRINTF_DECORATE(name) stbsp_##name // define this before including if you want to change the names +#endif + +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, va_list va); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsnprintf)(char *buf, int count, char const *fmt, va_list va); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, ...) STBSP__ATTRIBUTE_FORMAT(2,3); +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...) STBSP__ATTRIBUTE_FORMAT(3,4); + +STBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, void *user, char *buf, char const *fmt, va_list va); +STBSP__PUBLICDEC void STB_SPRINTF_DECORATE(set_separators)(char comma, char period); + +#endif // STB_SPRINTF_H_INCLUDE + +#ifdef STB_SPRINTF_IMPLEMENTATION + +#define stbsp__uint32 unsigned int +#define stbsp__int32 signed int + +#ifdef _MSC_VER +#define stbsp__uint64 unsigned __int64 +#define stbsp__int64 signed __int64 +#else +#define stbsp__uint64 unsigned long long +#define stbsp__int64 signed long long +#endif +#define stbsp__uint16 unsigned short + +#ifndef stbsp__uintptr +#if defined(__ppc64__) || defined(__powerpc64__) || defined(__aarch64__) || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || defined(__s390x__) +#define stbsp__uintptr stbsp__uint64 +#else +#define stbsp__uintptr stbsp__uint32 +#endif +#endif + +#ifndef STB_SPRINTF_MSVC_MODE // used for MSVC2013 and earlier (MSVC2015 matches GCC) +#if defined(_MSC_VER) && (_MSC_VER < 1900) +#define STB_SPRINTF_MSVC_MODE +#endif +#endif + +#ifdef STB_SPRINTF_NOUNALIGNED // define this before inclusion to force stbsp_sprintf to always use aligned accesses +#define STBSP__UNALIGNED(code) +#else +#define STBSP__UNALIGNED(code) code +#endif + +#ifndef STB_SPRINTF_NOFLOAT +// internal float utility functions +static stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, char *out, stbsp__int32 *decimal_pos, double value, stbsp__uint32 frac_digits); +static stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, double value); +#define STBSP__SPECIAL 0x7000 +#endif + +static char stbsp__period = '.'; +static char stbsp__comma = ','; +static struct +{ + short temp; // force next field to be 2-byte aligned + char pair[201]; +} stbsp__digitpair = +{ + 0, + "00010203040506070809101112131415161718192021222324" + "25262728293031323334353637383940414243444546474849" + "50515253545556575859606162636465666768697071727374" + "75767778798081828384858687888990919293949596979899" +}; + +STBSP__PUBLICDEF void STB_SPRINTF_DECORATE(set_separators)(char pcomma, char pperiod) +{ + stbsp__period = pperiod; + stbsp__comma = pcomma; +} + +#define STBSP__LEFTJUST 1 +#define STBSP__LEADINGPLUS 2 +#define STBSP__LEADINGSPACE 4 +#define STBSP__LEADING_0X 8 +#define STBSP__LEADINGZERO 16 +#define STBSP__INTMAX 32 +#define STBSP__TRIPLET_COMMA 64 +#define STBSP__NEGATIVE 128 +#define STBSP__METRIC_SUFFIX 256 +#define STBSP__HALFWIDTH 512 +#define STBSP__METRIC_NOSPACE 1024 +#define STBSP__METRIC_1024 2048 +#define STBSP__METRIC_JEDEC 4096 + +static void stbsp__lead_sign(stbsp__uint32 fl, char *sign) +{ + sign[0] = 0; + if (fl & STBSP__NEGATIVE) { + sign[0] = 1; + sign[1] = '-'; + } else if (fl & STBSP__LEADINGSPACE) { + sign[0] = 1; + sign[1] = ' '; + } else if (fl & STBSP__LEADINGPLUS) { + sign[0] = 1; + sign[1] = '+'; + } +} + +static STBSP__ASAN stbsp__uint32 stbsp__strlen_limited(char const *s, stbsp__uint32 limit) +{ + char const * sn = s; + + // get up to 4-byte alignment + for (;;) { + if (((stbsp__uintptr)sn & 3) == 0) + break; + + if (!limit || *sn == 0) + return (stbsp__uint32)(sn - s); + + ++sn; + --limit; + } + + // scan over 4 bytes at a time to find terminating 0 + // this will intentionally scan up to 3 bytes past the end of buffers, + // but becase it works 4B aligned, it will never cross page boundaries + // (hence the STBSP__ASAN markup; the over-read here is intentional + // and harmless) + while (limit >= 4) { + stbsp__uint32 v = *(stbsp__uint32 *)sn; + // bit hack to find if there's a 0 byte in there + if ((v - 0x01010101) & (~v) & 0x80808080UL) + break; + + sn += 4; + limit -= 4; + } + + // handle the last few characters to find actual size + while (limit && *sn) { + ++sn; + --limit; + } + + return (stbsp__uint32)(sn - s); +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, void *user, char *buf, char const *fmt, va_list va) +{ + static char hex[] = "0123456789abcdefxp"; + static char hexu[] = "0123456789ABCDEFXP"; + char *bf; + char const *f; + int tlen = 0; + + bf = buf; + f = fmt; + for (;;) { + stbsp__int32 fw, pr, tz; + stbsp__uint32 fl; + + // macros for the callback buffer stuff +#define stbsp__chk_cb_bufL(bytes) \ +{ \ +int len = (int)(bf - buf); \ +if ((len + (bytes)) >= STB_SPRINTF_MIN) { \ +tlen += len; \ +if (0 == (bf = buf = callback(buf, user, len))) \ +goto done; \ +} \ +} +#define stbsp__chk_cb_buf(bytes) \ +{ \ +if (callback) { \ +stbsp__chk_cb_bufL(bytes); \ +} \ +} +#define stbsp__flush_cb() \ +{ \ +stbsp__chk_cb_bufL(STB_SPRINTF_MIN - 1); \ +} // flush if there is even one byte in the buffer +#define stbsp__cb_buf_clamp(cl, v) \ +cl = v; \ +if (callback) { \ +int lg = STB_SPRINTF_MIN - (int)(bf - buf); \ +if (cl > lg) \ +cl = lg; \ +} + + // fast copy everything up to the next % (or end of string) + for (;;) { + while (((stbsp__uintptr)f) & 3) { + schk1: + if (f[0] == '%') + goto scandd; + schk2: + if (f[0] == 0) + goto endfmt; + stbsp__chk_cb_buf(1); + *bf++ = f[0]; + ++f; + } + for (;;) { + // Check if the next 4 bytes contain %(0x25) or end of string. + // Using the 'hasless' trick: + // https://graphics.stanford.edu/~seander/bithacks.html#HasLessInWord + stbsp__uint32 v, c; + v = *(stbsp__uint32 *)f; + c = (~v) & 0x80808080; + if (((v ^ 0x25252525) - 0x01010101) & c) + goto schk1; + if ((v - 0x01010101) & c) + goto schk2; + if (callback) + if ((STB_SPRINTF_MIN - (int)(bf - buf)) < 4) + goto schk1; +#ifdef STB_SPRINTF_NOUNALIGNED + if(((stbsp__uintptr)bf) & 3) { + bf[0] = f[0]; + bf[1] = f[1]; + bf[2] = f[2]; + bf[3] = f[3]; + } else +#endif + { + *(stbsp__uint32 *)bf = v; + } + bf += 4; + f += 4; + } + } + scandd: + + ++f; + + // ok, we have a percent, read the modifiers first + fw = 0; + pr = -1; + fl = 0; + tz = 0; + + // flags + for (;;) { + switch (f[0]) { + // if we have left justify + case '-': + fl |= STBSP__LEFTJUST; + ++f; + continue; + // if we have leading plus + case '+': + fl |= STBSP__LEADINGPLUS; + ++f; + continue; + // if we have leading space + case ' ': + fl |= STBSP__LEADINGSPACE; + ++f; + continue; + // if we have leading 0x + case '#': + fl |= STBSP__LEADING_0X; + ++f; + continue; + // if we have thousand commas + case '\'': + fl |= STBSP__TRIPLET_COMMA; + ++f; + continue; + // if we have kilo marker (none->kilo->kibi->jedec) + case '$': + if (fl & STBSP__METRIC_SUFFIX) { + if (fl & STBSP__METRIC_1024) { + fl |= STBSP__METRIC_JEDEC; + } else { + fl |= STBSP__METRIC_1024; + } + } else { + fl |= STBSP__METRIC_SUFFIX; + } + ++f; + continue; + // if we don't want space between metric suffix and number + case '_': + fl |= STBSP__METRIC_NOSPACE; + ++f; + continue; + // if we have leading zero + case '0': + fl |= STBSP__LEADINGZERO; + ++f; + goto flags_done; + default: goto flags_done; + } + } + flags_done: + + // get the field width + if (f[0] == '*') { + fw = va_arg(va, stbsp__uint32); + ++f; + } else { + while ((f[0] >= '0') && (f[0] <= '9')) { + fw = fw * 10 + f[0] - '0'; + f++; + } + } + // get the precision + if (f[0] == '.') { + ++f; + if (f[0] == '*') { + pr = va_arg(va, stbsp__uint32); + ++f; + } else { + pr = 0; + while ((f[0] >= '0') && (f[0] <= '9')) { + pr = pr * 10 + f[0] - '0'; + f++; + } + } + } + + // handle integer size overrides + switch (f[0]) { + // are we halfwidth? + case 'h': + fl |= STBSP__HALFWIDTH; + ++f; + if (f[0] == 'h') + ++f; // QUARTERWIDTH + break; + // are we 64-bit (unix style) + case 'l': + fl |= ((sizeof(long) == 8) ? STBSP__INTMAX : 0); + ++f; + if (f[0] == 'l') { + fl |= STBSP__INTMAX; + ++f; + } + break; + // are we 64-bit on intmax? (c99) + case 'j': + fl |= (sizeof(size_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + // are we 64-bit on size_t or ptrdiff_t? (c99) + case 'z': + fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + case 't': + fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0; + ++f; + break; + // are we 64-bit (msft style) + case 'I': + if ((f[1] == '6') && (f[2] == '4')) { + fl |= STBSP__INTMAX; + f += 3; + } else if ((f[1] == '3') && (f[2] == '2')) { + f += 3; + } else { + fl |= ((sizeof(void *) == 8) ? STBSP__INTMAX : 0); + ++f; + } + break; + default: break; + } + + // handle each replacement + switch (f[0]) { +#define STBSP__NUMSZ 512 // big enough for e308 (with commas) or e-307 + char num[STBSP__NUMSZ]; + char lead[8]; + char tail[8]; + char *s; + char const *h; + stbsp__uint32 l, n, cs; + stbsp__uint64 n64; +#ifndef STB_SPRINTF_NOFLOAT + double fv; +#endif + stbsp__int32 dp; + char const *sn; + + case 's': + // get the string + s = va_arg(va, char *); + if (s == 0) + s = (char *)"null"; + // get the length, limited to desired precision + // always limit to ~0u chars since our counts are 32b + l = stbsp__strlen_limited(s, (pr >= 0) ? pr : ~0u); + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + // copy the string in + goto scopy; + + case 'c': // char + // get the character + s = num + STBSP__NUMSZ - 1; + *s = (char)va_arg(va, int); + l = 1; + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + goto scopy; + + case 'n': // weird write-bytes specifier + { + int *d = va_arg(va, int *); + *d = tlen + (int)(bf - buf); + } break; + +#ifdef STB_SPRINTF_NOFLOAT + case 'A': // float + case 'a': // hex float + case 'G': // float + case 'g': // float + case 'E': // float + case 'e': // float + case 'f': // float + va_arg(va, double); // eat it + s = (char *)"No float"; + l = 8; + lead[0] = 0; + tail[0] = 0; + pr = 0; + cs = 0; + STBSP__NOTUSED(dp); + goto scopy; +#else + case 'A': // hex float + case 'a': // hex float + h = (f[0] == 'A') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_parts((stbsp__int64 *)&n64, &dp, fv)) + fl |= STBSP__NEGATIVE; + + s = num + 64; + + stbsp__lead_sign(fl, lead); + + if (dp == -1023) + dp = (n64) ? -1022 : 0; + else + n64 |= (((stbsp__uint64)1) << 52); + n64 <<= (64 - 56); + if (pr < 15) + n64 += ((((stbsp__uint64)8) << 56) >> (pr * 4)); + // add leading chars + +#ifdef STB_SPRINTF_MSVC_MODE + *s++ = '0'; + *s++ = 'x'; +#else + lead[1 + lead[0]] = '0'; + lead[2 + lead[0]] = 'x'; + lead[0] += 2; +#endif + *s++ = h[(n64 >> 60) & 15]; + n64 <<= 4; + if (pr) + *s++ = stbsp__period; + sn = s; + + // print the bits + n = pr; + if (n > 13) + n = 13; + if (pr > (stbsp__int32)n) + tz = pr - n; + pr = 0; + while (n--) { + *s++ = h[(n64 >> 60) & 15]; + n64 <<= 4; + } + + // print the expo + tail[1] = h[17]; + if (dp < 0) { + tail[2] = '-'; + dp = -dp; + } else + tail[2] = '+'; + n = (dp >= 1000) ? 6 : ((dp >= 100) ? 5 : ((dp >= 10) ? 4 : 3)); + tail[0] = (char)n; + for (;;) { + tail[n] = '0' + dp % 10; + if (n <= 3) + break; + --n; + dp /= 10; + } + + dp = (int)(s - sn); + l = (int)(s - (num + 64)); + s = num + 64; + cs = 1 + (3 << 24); + goto scopy; + + case 'G': // float + case 'g': // float + h = (f[0] == 'G') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; + else if (pr == 0) + pr = 1; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, (pr - 1) | 0x80000000)) + fl |= STBSP__NEGATIVE; + + // clamp the precision and delete extra zeros after clamp + n = pr; + if (l > (stbsp__uint32)pr) + l = pr; + while ((l > 1) && (pr) && (sn[l - 1] == '0')) { + --pr; + --l; + } + + // should we use %e + if ((dp <= -4) || (dp > (stbsp__int32)n)) { + if (pr > (stbsp__int32)l) + pr = l - 1; + else if (pr) + --pr; // when using %e, there is one digit before the decimal + goto doexpfromg; + } + // this is the insane action to get the pr to match %g semantics for %f + if (dp > 0) { + pr = (dp < (stbsp__int32)l) ? l - dp : 0; + } else { + pr = -dp + ((pr > (stbsp__int32)l) ? (stbsp__int32) l : pr); + } + goto dofloatfromg; + + case 'E': // float + case 'e': // float + h = (f[0] == 'E') ? hexu : hex; + fv = va_arg(va, double); + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr | 0x80000000)) + fl |= STBSP__NEGATIVE; + doexpfromg: + tail[0] = 0; + stbsp__lead_sign(fl, lead); + if (dp == STBSP__SPECIAL) { + s = (char *)sn; + cs = 0; + pr = 0; + goto scopy; + } + s = num + 64; + // handle leading chars + *s++ = sn[0]; + + if (pr) + *s++ = stbsp__period; + + // handle after decimal + if ((l - 1) > (stbsp__uint32)pr) + l = pr + 1; + for (n = 1; n < l; n++) + *s++ = sn[n]; + // trailing zeros + tz = pr - (l - 1); + pr = 0; + // dump expo + tail[1] = h[0xe]; + dp -= 1; + if (dp < 0) { + tail[2] = '-'; + dp = -dp; + } else + tail[2] = '+'; +#ifdef STB_SPRINTF_MSVC_MODE + n = 5; +#else + n = (dp >= 100) ? 5 : 4; +#endif + tail[0] = (char)n; + for (;;) { + tail[n] = '0' + dp % 10; + if (n <= 3) + break; + --n; + dp /= 10; + } + cs = 1 + (3 << 24); // how many tens + goto flt_lead; + + case 'f': // float + fv = va_arg(va, double); + doafloat: + // do kilos + if (fl & STBSP__METRIC_SUFFIX) { + double divisor; + divisor = 1000.0f; + if (fl & STBSP__METRIC_1024) + divisor = 1024.0; + while (fl < 0x4000000) { + if ((fv < divisor) && (fv > -divisor)) + break; + fv /= divisor; + fl += 0x1000000; + } + } + if (pr == -1) + pr = 6; // default is 6 + // read the double into a string + if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr)) + fl |= STBSP__NEGATIVE; + dofloatfromg: + tail[0] = 0; + stbsp__lead_sign(fl, lead); + if (dp == STBSP__SPECIAL) { + s = (char *)sn; + cs = 0; + pr = 0; + goto scopy; + } + s = num + 64; + + // handle the three decimal varieties + if (dp <= 0) { + stbsp__int32 i; + // handle 0.000*000xxxx + *s++ = '0'; + if (pr) + *s++ = stbsp__period; + n = -dp; + if ((stbsp__int32)n > pr) + n = pr; + i = n; + while (i) { + if ((((stbsp__uintptr)s) & 3) == 0) + break; + *s++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)s = 0x30303030; + s += 4; + i -= 4; + } + while (i) { + *s++ = '0'; + --i; + } + if ((stbsp__int32)(l + n) > pr) + l = pr - n; + i = l; + while (i) { + *s++ = *sn++; + --i; + } + tz = pr - (n + l); + cs = 1 + (3 << 24); // how many tens did we write (for commas below) + } else { + cs = (fl & STBSP__TRIPLET_COMMA) ? ((600 - (stbsp__uint32)dp) % 3) : 0; + if ((stbsp__uint32)dp >= l) { + // handle xxxx000*000.0 + n = 0; + for (;;) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = sn[n]; + ++n; + if (n >= l) + break; + } + } + if (n < (stbsp__uint32)dp) { + n = dp - n; + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + while (n) { + if ((((stbsp__uintptr)s) & 3) == 0) + break; + *s++ = '0'; + --n; + } + while (n >= 4) { + *(stbsp__uint32 *)s = 0x30303030; + s += 4; + n -= 4; + } + } + while (n) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = '0'; + --n; + } + } + } + cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens + if (pr) { + *s++ = stbsp__period; + tz = pr; + } + } else { + // handle xxxxx.xxxx000*000 + n = 0; + for (;;) { + if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) { + cs = 0; + *s++ = stbsp__comma; + } else { + *s++ = sn[n]; + ++n; + if (n >= (stbsp__uint32)dp) + break; + } + } + cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens + if (pr) + *s++ = stbsp__period; + if ((l - dp) > (stbsp__uint32)pr) + l = pr + dp; + while (n < l) { + *s++ = sn[n]; + ++n; + } + tz = pr - (l - dp); + } + } + pr = 0; + + // handle k,m,g,t + if (fl & STBSP__METRIC_SUFFIX) { + char idx; + idx = 1; + if (fl & STBSP__METRIC_NOSPACE) + idx = 0; + tail[0] = idx; + tail[1] = ' '; + { + if (fl >> 24) { // SI kilo is 'k', JEDEC and SI kibits are 'K'. + if (fl & STBSP__METRIC_1024) + tail[idx + 1] = "_KMGT"[fl >> 24]; + else + tail[idx + 1] = "_kMGT"[fl >> 24]; + idx++; + // If printing kibits and not in jedec, add the 'i'. + if (fl & STBSP__METRIC_1024 && !(fl & STBSP__METRIC_JEDEC)) { + tail[idx + 1] = 'i'; + idx++; + } + tail[0] = idx; + } + } + }; + + flt_lead: + // get the length that we copied + l = (stbsp__uint32)(s - (num + 64)); + s = num + 64; + goto scopy; +#endif + + case 'B': // upper binary + case 'b': // lower binary + h = (f[0] == 'B') ? hexu : hex; + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 2; + lead[1] = '0'; + lead[2] = h[0xb]; + } + l = (8 << 4) | (1 << 8); + goto radixnum; + + case 'o': // octal + h = hexu; + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 1; + lead[1] = '0'; + } + l = (3 << 4) | (3 << 8); + goto radixnum; + + case 'p': // pointer + fl |= (sizeof(void *) == 8) ? STBSP__INTMAX : 0; + pr = sizeof(void *) * 2; + fl &= ~STBSP__LEADINGZERO; // 'p' only prints the pointer with zeros + // fall through - to X + + case 'X': // upper hex + case 'x': // lower hex + h = (f[0] == 'X') ? hexu : hex; + l = (4 << 4) | (4 << 8); + lead[0] = 0; + if (fl & STBSP__LEADING_0X) { + lead[0] = 2; + lead[1] = '0'; + lead[2] = h[16]; + } + radixnum: + // get the number + if (fl & STBSP__INTMAX) + n64 = va_arg(va, stbsp__uint64); + else + n64 = va_arg(va, stbsp__uint32); + + s = num + STBSP__NUMSZ; + dp = 0; + // clear tail, and clear leading if value is zero + tail[0] = 0; + if (n64 == 0) { + lead[0] = 0; + if (pr == 0) { + l = 0; + cs = 0; + goto scopy; + } + } + // convert to string + for (;;) { + *--s = h[n64 & ((1 << (l >> 8)) - 1)]; + n64 >>= (l >> 8); + if (!((n64) || ((stbsp__int32)((num + STBSP__NUMSZ) - s) < pr))) + break; + if (fl & STBSP__TRIPLET_COMMA) { + ++l; + if ((l & 15) == ((l >> 4) & 15)) { + l &= ~15; + *--s = stbsp__comma; + } + } + }; + // get the tens and the comma pos + cs = (stbsp__uint32)((num + STBSP__NUMSZ) - s) + ((((l >> 4) & 15)) << 24); + // get the length that we copied + l = (stbsp__uint32)((num + STBSP__NUMSZ) - s); + // copy it + goto scopy; + + case 'u': // unsigned + case 'i': + case 'd': // integer + // get the integer and abs it + if (fl & STBSP__INTMAX) { + stbsp__int64 i64 = va_arg(va, stbsp__int64); + n64 = (stbsp__uint64)i64; + if ((f[0] != 'u') && (i64 < 0)) { + n64 = (stbsp__uint64)-i64; + fl |= STBSP__NEGATIVE; + } + } else { + stbsp__int32 i = va_arg(va, stbsp__int32); + n64 = (stbsp__uint32)i; + if ((f[0] != 'u') && (i < 0)) { + n64 = (stbsp__uint32)-i; + fl |= STBSP__NEGATIVE; + } + } + +#ifndef STB_SPRINTF_NOFLOAT + if (fl & STBSP__METRIC_SUFFIX) { + if (n64 < 1024) + pr = 0; + else if (pr == -1) + pr = 1; + fv = (double)(stbsp__int64)n64; + goto doafloat; + } +#endif + + // convert to string + s = num + STBSP__NUMSZ; + l = 0; + + for (;;) { + // do in 32-bit chunks (avoid lots of 64-bit divides even with constant denominators) + char *o = s - 8; + if (n64 >= 100000000) { + n = (stbsp__uint32)(n64 % 100000000); + n64 /= 100000000; + } else { + n = (stbsp__uint32)n64; + n64 = 0; + } + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + do { + s -= 2; + *(stbsp__uint16 *)s = *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2]; + n /= 100; + } while (n); + } + while (n) { + if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) { + l = 0; + *--s = stbsp__comma; + --o; + } else { + *--s = (char)(n % 10) + '0'; + n /= 10; + } + } + if (n64 == 0) { + if ((s[0] == '0') && (s != (num + STBSP__NUMSZ))) + ++s; + break; + } + while (s != o) + if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) { + l = 0; + *--s = stbsp__comma; + --o; + } else { + *--s = '0'; + } + } + + tail[0] = 0; + stbsp__lead_sign(fl, lead); + + // get the length that we copied + l = (stbsp__uint32)((num + STBSP__NUMSZ) - s); + if (l == 0) { + *--s = '0'; + l = 1; + } + cs = l + (3 << 24); + if (pr < 0) + pr = 0; + + scopy: + // get fw=leading/trailing space, pr=leading zeros + if (pr < (stbsp__int32)l) + pr = l; + n = pr + lead[0] + tail[0] + tz; + if (fw < (stbsp__int32)n) + fw = n; + fw -= n; + pr -= l; + + // handle right justify and leading zeros + if ((fl & STBSP__LEFTJUST) == 0) { + if (fl & STBSP__LEADINGZERO) // if leading zeros, everything is in pr + { + pr = (fw > pr) ? fw : pr; + fw = 0; + } else { + fl &= ~STBSP__TRIPLET_COMMA; // if no leading zeros, then no commas + } + } + + // copy the spaces and/or zeros + if (fw + pr) { + stbsp__int32 i; + stbsp__uint32 c; + + // copy leading spaces (or when doing %8.4d stuff) + if ((fl & STBSP__LEFTJUST) == 0) + while (fw > 0) { + stbsp__cb_buf_clamp(i, fw); + fw -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = ' '; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x20202020; + bf += 4; + i -= 4; + } + while (i) { + *bf++ = ' '; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy leader + sn = lead + 1; + while (lead[0]) { + stbsp__cb_buf_clamp(i, lead[0]); + lead[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy leading zeros + c = cs >> 24; + cs &= 0xffffff; + cs = (fl & STBSP__TRIPLET_COMMA) ? ((stbsp__uint32)(c - ((pr + cs) % (c + 1)))) : 0; + while (pr > 0) { + stbsp__cb_buf_clamp(i, pr); + pr -= i; + if ((fl & STBSP__TRIPLET_COMMA) == 0) { + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x30303030; + bf += 4; + i -= 4; + } + } + while (i) { + if ((fl & STBSP__TRIPLET_COMMA) && (cs++ == c)) { + cs = 0; + *bf++ = stbsp__comma; + } else + *bf++ = '0'; + --i; + } + stbsp__chk_cb_buf(1); + } + } + + // copy leader if there is still one + sn = lead + 1; + while (lead[0]) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, lead[0]); + lead[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy the string + n = l; + while (n) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, n); + n -= i; + STBSP__UNALIGNED(while (i >= 4) { + *(stbsp__uint32 volatile *)bf = *(stbsp__uint32 volatile *)s; + bf += 4; + s += 4; + i -= 4; + }) + while (i) { + *bf++ = *s++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy trailing zeros + while (tz) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, tz); + tz -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = '0'; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x30303030; + bf += 4; + i -= 4; + } + while (i) { + *bf++ = '0'; + --i; + } + stbsp__chk_cb_buf(1); + } + + // copy tail if there is one + sn = tail + 1; + while (tail[0]) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, tail[0]); + tail[0] -= (char)i; + while (i) { + *bf++ = *sn++; + --i; + } + stbsp__chk_cb_buf(1); + } + + // handle the left justify + if (fl & STBSP__LEFTJUST) + if (fw > 0) { + while (fw) { + stbsp__int32 i; + stbsp__cb_buf_clamp(i, fw); + fw -= i; + while (i) { + if ((((stbsp__uintptr)bf) & 3) == 0) + break; + *bf++ = ' '; + --i; + } + while (i >= 4) { + *(stbsp__uint32 *)bf = 0x20202020; + bf += 4; + i -= 4; + } + while (i--) + *bf++ = ' '; + stbsp__chk_cb_buf(1); + } + } + break; + + default: // unknown, just copy code + s = num + STBSP__NUMSZ - 1; + *s = f[0]; + l = 1; + fw = fl = 0; + lead[0] = 0; + tail[0] = 0; + pr = 0; + dp = 0; + cs = 0; + goto scopy; + } + ++f; + } + endfmt: + + if (!callback) + *bf = 0; + else + stbsp__flush_cb(); + + done: + return tlen + (int)(bf - buf); +} + +// cleanup +#undef STBSP__LEFTJUST +#undef STBSP__LEADINGPLUS +#undef STBSP__LEADINGSPACE +#undef STBSP__LEADING_0X +#undef STBSP__LEADINGZERO +#undef STBSP__INTMAX +#undef STBSP__TRIPLET_COMMA +#undef STBSP__NEGATIVE +#undef STBSP__METRIC_SUFFIX +#undef STBSP__NUMSZ +#undef stbsp__chk_cb_bufL +#undef stbsp__chk_cb_buf +#undef stbsp__flush_cb +#undef stbsp__cb_buf_clamp + +// ============================================================================ +// wrapper functions + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, ...) +{ + int result; + va_list va; + va_start(va, fmt); + result = STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va); + va_end(va); + return result; +} + +typedef struct stbsp__context { + char *buf; + int count; + int length; + char tmp[STB_SPRINTF_MIN]; +} stbsp__context; + +static char *stbsp__clamp_callback(const char *buf, void *user, int len) +{ + stbsp__context *c = (stbsp__context *)user; + c->length += len; + + if (len > c->count) + len = c->count; + + if (len) { + if (buf != c->buf) { + const char *s, *se; + char *d; + d = c->buf; + s = buf; + se = buf + len; + do { + *d++ = *s++; + } while (s < se); + } + c->buf += len; + c->count -= len; + } + + if (c->count <= 0) + return c->tmp; + return (c->count >= STB_SPRINTF_MIN) ? c->buf : c->tmp; // go direct into buffer if you can +} + +static char * stbsp__count_clamp_callback( const char * buf, void * user, int len ) +{ + stbsp__context * c = (stbsp__context*)user; + (void) sizeof(buf); + + c->length += len; + return c->tmp; // go direct into buffer if you can +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE( vsnprintf )( char * buf, int count, char const * fmt, va_list va ) +{ + stbsp__context c; + + if ( (count == 0) && !buf ) + { + c.length = 0; + + STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__count_clamp_callback, &c, c.tmp, fmt, va ); + } + else + { + int l; + + c.buf = buf; + c.count = count; + c.length = 0; + + STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__clamp_callback, &c, stbsp__clamp_callback(0,&c,0), fmt, va ); + + // zero-terminate + l = (int)( c.buf - buf ); + if ( l >= count ) // should never be greater, only equal (or less) than count + l = count - 1; + buf[l] = 0; + } + + return c.length; +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...) +{ + int result; + va_list va; + va_start(va, fmt); + + result = STB_SPRINTF_DECORATE(vsnprintf)(buf, count, fmt, va); + va_end(va); + + return result; +} + +STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, va_list va) +{ + return STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va); +} + +// ======================================================================= +// low level float utility functions + +#ifndef STB_SPRINTF_NOFLOAT + +// copies d to bits w/ strict aliasing (this compiles to nothing on /Ox) +#define STBSP__COPYFP(dest, src) \ +{ \ +int cn; \ +for (cn = 0; cn < 8; cn++) \ +((char *)&dest)[cn] = ((char *)&src)[cn]; \ +} + +// get float info +static stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, double value) +{ + double d; + stbsp__int64 b = 0; + + // load value and round at the frac_digits + d = value; + + STBSP__COPYFP(b, d); + + *bits = b & ((((stbsp__uint64)1) << 52) - 1); + *expo = (stbsp__int32)(((b >> 52) & 2047) - 1023); + + return (stbsp__int32)((stbsp__uint64) b >> 63); +} + +static double const stbsp__bot[23] = { + 1e+000, 1e+001, 1e+002, 1e+003, 1e+004, 1e+005, 1e+006, 1e+007, 1e+008, 1e+009, 1e+010, 1e+011, + 1e+012, 1e+013, 1e+014, 1e+015, 1e+016, 1e+017, 1e+018, 1e+019, 1e+020, 1e+021, 1e+022 +}; +static double const stbsp__negbot[22] = { + 1e-001, 1e-002, 1e-003, 1e-004, 1e-005, 1e-006, 1e-007, 1e-008, 1e-009, 1e-010, 1e-011, + 1e-012, 1e-013, 1e-014, 1e-015, 1e-016, 1e-017, 1e-018, 1e-019, 1e-020, 1e-021, 1e-022 +}; +static double const stbsp__negboterr[22] = { + -5.551115123125783e-018, -2.0816681711721684e-019, -2.0816681711721686e-020, -4.7921736023859299e-021, -8.1803053914031305e-022, 4.5251888174113741e-023, + 4.5251888174113739e-024, -2.0922560830128471e-025, -6.2281591457779853e-026, -3.6432197315497743e-027, 6.0503030718060191e-028, 2.0113352370744385e-029, + -3.0373745563400371e-030, 1.1806906454401013e-032, -7.7705399876661076e-032, 2.0902213275965398e-033, -7.1542424054621921e-034, -7.1542424054621926e-035, + 2.4754073164739869e-036, 5.4846728545790429e-037, 9.2462547772103625e-038, -4.8596774326570872e-039 +}; +static double const stbsp__top[13] = { + 1e+023, 1e+046, 1e+069, 1e+092, 1e+115, 1e+138, 1e+161, 1e+184, 1e+207, 1e+230, 1e+253, 1e+276, 1e+299 +}; +static double const stbsp__negtop[13] = { + 1e-023, 1e-046, 1e-069, 1e-092, 1e-115, 1e-138, 1e-161, 1e-184, 1e-207, 1e-230, 1e-253, 1e-276, 1e-299 +}; +static double const stbsp__toperr[13] = { + 8388608, + 6.8601809640529717e+028, + -7.253143638152921e+052, + -4.3377296974619174e+075, + -1.5559416129466825e+098, + -3.2841562489204913e+121, + -3.7745893248228135e+144, + -1.7356668416969134e+167, + -3.8893577551088374e+190, + -9.9566444326005119e+213, + 6.3641293062232429e+236, + -5.2069140800249813e+259, + -5.2504760255204387e+282 +}; +static double const stbsp__negtoperr[13] = { + 3.9565301985100693e-040, -2.299904345391321e-063, 3.6506201437945798e-086, 1.1875228833981544e-109, + -5.0644902316928607e-132, -6.7156837247865426e-155, -2.812077463003139e-178, -5.7778912386589953e-201, + 7.4997100559334532e-224, -4.6439668915134491e-247, -6.3691100762962136e-270, -9.436808465446358e-293, + 8.0970921678014997e-317 +}; + +#if defined(_MSC_VER) && (_MSC_VER <= 1200) +static stbsp__uint64 const stbsp__powten[20] = { + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000, + 100000000000, + 1000000000000, + 10000000000000, + 100000000000000, + 1000000000000000, + 10000000000000000, + 100000000000000000, + 1000000000000000000, + 10000000000000000000U +}; +#define stbsp__tento19th ((stbsp__uint64)1000000000000000000) +#else +static stbsp__uint64 const stbsp__powten[20] = { + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000ULL, + 100000000000ULL, + 1000000000000ULL, + 10000000000000ULL, + 100000000000000ULL, + 1000000000000000ULL, + 10000000000000000ULL, + 100000000000000000ULL, + 1000000000000000000ULL, + 10000000000000000000ULL +}; +#define stbsp__tento19th (1000000000000000000ULL) +#endif + +#define stbsp__ddmulthi(oh, ol, xh, yh) \ +{ \ +double ahi = 0, alo, bhi = 0, blo; \ +stbsp__int64 bt; \ +oh = xh * yh; \ +STBSP__COPYFP(bt, xh); \ +bt &= ((~(stbsp__uint64)0) << 27); \ +STBSP__COPYFP(ahi, bt); \ +alo = xh - ahi; \ +STBSP__COPYFP(bt, yh); \ +bt &= ((~(stbsp__uint64)0) << 27); \ +STBSP__COPYFP(bhi, bt); \ +blo = yh - bhi; \ +ol = ((ahi * bhi - oh) + ahi * blo + alo * bhi) + alo * blo; \ +} + +#define stbsp__ddtoS64(ob, xh, xl) \ +{ \ +double ahi = 0, alo, vh, t; \ +ob = (stbsp__int64)xh; \ +vh = (double)ob; \ +ahi = (xh - vh); \ +t = (ahi - xh); \ +alo = (xh - (ahi - t)) - (vh + t); \ +ob += (stbsp__int64)(ahi + alo + xl); \ +} + +#define stbsp__ddrenorm(oh, ol) \ +{ \ +double s; \ +s = oh + ol; \ +ol = ol - (s - oh); \ +oh = s; \ +} + +#define stbsp__ddmultlo(oh, ol, xh, xl, yh, yl) ol = ol + (xh * yl + xl * yh); + +#define stbsp__ddmultlos(oh, ol, xh, yl) ol = ol + (xh * yl); + +static void stbsp__raise_to_power10(double *ohi, double *olo, double d, stbsp__int32 power) // power can be -323 to +350 +{ + double ph, pl; + if ((power >= 0) && (power <= 22)) { + stbsp__ddmulthi(ph, pl, d, stbsp__bot[power]); + } else { + stbsp__int32 e, et, eb; + double p2h, p2l; + + e = power; + if (power < 0) + e = -e; + et = (e * 0x2c9) >> 14; /* %23 */ + if (et > 13) + et = 13; + eb = e - (et * 23); + + ph = d; + pl = 0.0; + if (power < 0) { + if (eb) { + --eb; + stbsp__ddmulthi(ph, pl, d, stbsp__negbot[eb]); + stbsp__ddmultlos(ph, pl, d, stbsp__negboterr[eb]); + } + if (et) { + stbsp__ddrenorm(ph, pl); + --et; + stbsp__ddmulthi(p2h, p2l, ph, stbsp__negtop[et]); + stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__negtop[et], stbsp__negtoperr[et]); + ph = p2h; + pl = p2l; + } + } else { + if (eb) { + e = eb; + if (eb > 22) + eb = 22; + e -= eb; + stbsp__ddmulthi(ph, pl, d, stbsp__bot[eb]); + if (e) { + stbsp__ddrenorm(ph, pl); + stbsp__ddmulthi(p2h, p2l, ph, stbsp__bot[e]); + stbsp__ddmultlos(p2h, p2l, stbsp__bot[e], pl); + ph = p2h; + pl = p2l; + } + } + if (et) { + stbsp__ddrenorm(ph, pl); + --et; + stbsp__ddmulthi(p2h, p2l, ph, stbsp__top[et]); + stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__top[et], stbsp__toperr[et]); + ph = p2h; + pl = p2l; + } + } + } + stbsp__ddrenorm(ph, pl); + *ohi = ph; + *olo = pl; +} + +// given a float value, returns the significant bits in bits, and the position of the +// decimal point in decimal_pos. +/-INF and NAN are specified by special values +// returned in the decimal_pos parameter. +// frac_digits is absolute normally, but if you want from first significant digits (got %g and %e), or in 0x80000000 +static stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, char *out, stbsp__int32 *decimal_pos, double value, stbsp__uint32 frac_digits) +{ + double d; + stbsp__int64 bits = 0; + stbsp__int32 expo, e, ng, tens; + + d = value; + STBSP__COPYFP(bits, d); + expo = (stbsp__int32)((bits >> 52) & 2047); + ng = (stbsp__int32)((stbsp__uint64) bits >> 63); + if (ng) + d = -d; + + if (expo == 2047) // is nan or inf? + { + *start = (bits & ((((stbsp__uint64)1) << 52) - 1)) ? "NaN" : "Inf"; + *decimal_pos = STBSP__SPECIAL; + *len = 3; + return ng; + } + + if (expo == 0) // is zero or denormal + { + if (((stbsp__uint64) bits << 1) == 0) // do zero + { + *decimal_pos = 1; + *start = out; + out[0] = '0'; + *len = 1; + return ng; + } + // find the right expo for denormals + { + stbsp__int64 v = ((stbsp__uint64)1) << 51; + while ((bits & v) == 0) { + --expo; + v >>= 1; + } + } + } + + // find the decimal exponent as well as the decimal bits of the value + { + double ph, pl; + + // log10 estimate - very specifically tweaked to hit or undershoot by no more than 1 of log10 of all expos 1..2046 + tens = expo - 1023; + tens = (tens < 0) ? ((tens * 617) / 2048) : (((tens * 1233) / 4096) + 1); + + // move the significant bits into position and stick them into an int + stbsp__raise_to_power10(&ph, &pl, d, 18 - tens); + + // get full as much precision from double-double as possible + stbsp__ddtoS64(bits, ph, pl); + + // check if we undershot + if (((stbsp__uint64)bits) >= stbsp__tento19th) + ++tens; + } + + // now do the rounding in integer land + frac_digits = (frac_digits & 0x80000000) ? ((frac_digits & 0x7ffffff) + 1) : (tens + frac_digits); + if ((frac_digits < 24)) { + stbsp__uint32 dg = 1; + if ((stbsp__uint64)bits >= stbsp__powten[9]) + dg = 10; + while ((stbsp__uint64)bits >= stbsp__powten[dg]) { + ++dg; + if (dg == 20) + goto noround; + } + if (frac_digits < dg) { + stbsp__uint64 r; + // add 0.5 at the right position and round + e = dg - frac_digits; + if ((stbsp__uint32)e >= 24) + goto noround; + r = stbsp__powten[e]; + bits = bits + (r / 2); + if ((stbsp__uint64)bits >= stbsp__powten[dg]) + ++tens; + bits /= r; + } + noround:; + } + + // kill long trailing runs of zeros + if (bits) { + stbsp__uint32 n; + for (;;) { + if (bits <= 0xffffffff) + break; + if (bits % 1000) + goto donez; + bits /= 1000; + } + n = (stbsp__uint32)bits; + while ((n % 1000) == 0) + n /= 1000; + bits = n; + donez:; + } + + // convert to string + out += 64; + e = 0; + for (;;) { + stbsp__uint32 n; + char *o = out - 8; + // do the conversion in chunks of U32s (avoid most 64-bit divides, worth it, constant denomiators be damned) + if (bits >= 100000000) { + n = (stbsp__uint32)(bits % 100000000); + bits /= 100000000; + } else { + n = (stbsp__uint32)bits; + bits = 0; + } + while (n) { + out -= 2; + *(stbsp__uint16 *)out = *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2]; + n /= 100; + e += 2; + } + if (bits == 0) { + if ((e) && (out[0] == '0')) { + ++out; + --e; + } + break; + } + while (out != o) { + *--out = '0'; + ++e; + } + } + + *decimal_pos = tens; + *start = out; + *len = e; + return ng; +} + +#undef stbsp__ddmulthi +#undef stbsp__ddrenorm +#undef stbsp__ddmultlo +#undef stbsp__ddmultlos +#undef STBSP__SPECIAL +#undef STBSP__COPYFP + +#endif // STB_SPRINTF_NOFLOAT + +// clean up +#undef stbsp__uint16 +#undef stbsp__uint32 +#undef stbsp__int32 +#undef stbsp__uint64 +#undef stbsp__int64 +#undef STBSP__UNALIGNED + +#endif // STB_SPRINTF_IMPLEMENTATION + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ \ No newline at end of file diff --git a/src_v2/lumenarium_bsp.h b/src_v2/lumenarium_bsp.h new file mode 100644 index 0000000..bd18720 --- /dev/null +++ b/src_v2/lumenarium_bsp.h @@ -0,0 +1,492 @@ +/* date = April 11th 2022 9:57 am */ + +#ifndef LUMENARIUM_BSP_H +#define LUMENARIUM_BSP_H + +// NOTE(PS): Functionality Notes +// - there must always be a root node that contains the area of the tree as a whole +// - a node with no children has not been split + +#define BTREE_NODE_ID_VALID_BIT (1 << 31) +struct BSP_Node_Id +{ + u32 value; +}; + +enum BSP_Split_Kind +{ + BSPSplit_XAxis = 1, + BSPSplit_YAxis = 0, + BSPSplit_ZAxis = 2, + BSPSplit_None = 3, +}; + +struct BSP_Split +{ + BSP_Split_Kind kind; + r32 value; +}; + +enum BSP_Split_Update_Flags +{ + BSPSplitUpdate_None = 0, + BSPSplitUpdate_FreeZeroAreaChildren = 1, +}; + +enum BSP_Child_Selector +{ + // NOTE(PS): these values are intentionally overlapping since + // they access the data structure of the B-Tree in a particular + // way. ie. left and top are the same space in memory as are + // right and bottom + BSPChild_Left = 0, + BSPChild_Top = 0, + + BSPChild_Right = 1, + BSPChild_Bottom = 1, +}; + +struct BSP_Area +{ + v2 min; + v2 max; +}; + +struct BSP_Node +{ + union + { + BSP_Node_Id parent; + BSP_Node_Id next_free; + }; + + BSP_Split split; + + union + { + BSP_Node_Id children[2]; + struct + { + union + { + BSP_Node_Id left; + BSP_Node_Id top; + }; + union + { + BSP_Node_Id right; + BSP_Node_Id bottom; + }; + }; + }; + u32 user_data; + + BSP_Area area; +}; + +struct BSP +{ + BSP_Node* nodes; + u32 nodes_cap; + u32 nodes_len; + + BSP_Node_Id root; + BSP_Node_Id free_first; +}; + +typedef void BSP_Walk_Cb(BSP* tree, BSP_Node_Id id, BSP_Node* node, u8* user_data); + +internal BSP bsp_create(Allocator* allocator, u32 cap); + +internal BSP_Node* bsp_get(BSP* tree, BSP_Node_Id id); +internal BSP_Node_Id bsp_push(BSP* tree, BSP_Node_Id parent, BSP_Area area, u32 user_data); +internal void bsp_free(BSP* tree, BSP_Node_Id id); +internal void bsp_free_cb(BSP* tree, BSP_Node_Id id, BSP* node, u8* user_data); + +union BSP_Split_Result +{ + BSP_Node_Id children[2]; + struct + { + union + { + BSP_Node_Id left; + BSP_Node_Id top; + }; + union + { + BSP_Node_Id right; + BSP_Node_Id bottom; + }; + }; +}; + +internal BSP_Split_Result bsp_split(BSP* tree, BSP_Node_Id id, r32 split, BSP_Split_Kind kind, u32 user_data_0, u32 user_data_1); +internal void bsp_join_recursive(BSP* tree, BSP_Node* parent, BSP_Child_Selector keep); + +// left, parent, right +internal void bsp_walk_inorder(BSP* tree, BSP_Node_Id first, BSP_Walk_Cb* cb, u8* user_data); +// parent, left right +internal void bsp_walk_preorder(BSP* tree, BSP_Node_Id first, BSP_Walk_Cb* cb, u8* user_data); +// parent, right, parent +internal void bsp_walk_postorder(BSP* tree, BSP_Node_Id first, BSP_Walk_Cb* cb, u8* user_data); + +internal void bsp_node_update_child_areas(BSP* tree, BSP_Node_Id id, BSP_Node* node, u8* user_data); +internal void bsp_node_area_update(BSP* tree, BSP_Node_Id id, BSP_Area new_area); +internal void bsp_child_split_update(BSP* tree, BSP_Node_Id node, u32 new_split); + +/////////////////////////////////////////////////// +// IMPLEMENTATION + + +internal BSP +bsp_create(Allocator* allocator, u32 cap) +{ + BSP result = {}; + zero_struct(result); + result.nodes_cap = cap; + result.nodes = allocator_alloc_array(allocator, BSP_Node, cap); + return result; +} + +#define bsp_node_id_is_valid(id) (has_flag(id.value, BTREE_NODE_ID_VALID_BIT)) +#define bsp_node_id_equals(a,b) (a.value == b.value) +#define bsp_node_id_to_index(id) (id.value & (u32)(~BTREE_NODE_ID_VALID_BIT)) + +internal BSP_Node* +bsp_get(BSP* tree, BSP_Node_Id id) +{ + if (!bsp_node_id_is_valid(id)) return 0; + u32 index = bsp_node_id_to_index(id); + if (index > tree->nodes_len) return 0; + return tree->nodes + index; +} + +internal BSP_Node_Id +bsp_push(BSP* tree, BSP_Node_Id parent_id, BSP_Area area, u32 user_data) +{ + BSP_Node_Id result = BSP_Node_Id{0}; + BSP_Node* node = 0; + + if (tree->nodes_len >= tree->nodes_cap) + { + if (bsp_node_id_is_valid(tree->free_first)) + { + result = tree->free_first; + node = bsp_get(tree, result); + tree->free_first = node->next_free; + zero_struct(node->parent); + } + } + else + { + result.value = tree->nodes_len++; + assert(!has_flag(result.value, BTREE_NODE_ID_VALID_BIT)); + add_flag(result.value, BTREE_NODE_ID_VALID_BIT); + node = tree->nodes + bsp_node_id_to_index(result); + } + + if (bsp_node_id_is_valid(result)) + { + node->split.kind = BSPSplit_None; + node->parent = parent_id; + node->area = area; + node->user_data = user_data; + } + + return result; +} + +internal void +bsp_free_(BSP* tree, BSP_Node_Id id, BSP_Node* now_free) +{ + if (bsp_node_id_is_valid(now_free->parent)) + { + BSP_Node* parent = bsp_get(tree, now_free->parent); + if (bsp_node_id_equals(parent->children[0], id)) + { + zero_struct(parent->children[0]); + } + else if (bsp_node_id_equals(parent->children[1], id)) + { + zero_struct(parent->children[1]); + } + else + { + // NOTE(PS): in this case, a child node had a reference to + // a parent that didn't have a reference back to the child + // this means the tree itself is messed up + invalid_code_path; + } + } + + zero_struct(*now_free); + now_free->next_free = tree->free_first; + tree->free_first = id; +} + +internal void +bsp_free(BSP* tree, BSP_Node_Id id) +{ + BSP_Node* now_free = bsp_get(tree, id); + bsp_free_(tree, id, now_free); +} + +internal void +bsp_free_cb(BSP* tree, BSP_Node_Id id, BSP_Node* node, u8* user_data) +{ + bsp_free_(tree, id, node); +} + +internal BSP_Split_Result +bsp_split(BSP* tree, BSP_Node_Id node_id, r32 split, BSP_Split_Kind kind, u32 user_data_0, u32 user_data_1) +{ + BSP_Node* node = bsp_get(tree, node_id); + split = clamp(node->area.min.Elements[kind], split, node->area.max.Elements[kind]); + node->split.value = split; + node->split.kind = kind; + node->children[0] = bsp_push(tree, node_id, {}, user_data_0); + node->children[1] = bsp_push(tree, node_id, {}, user_data_1); + bsp_node_update_child_areas(tree, node_id, node, 0); + + BSP_Split_Result result = {}; + result.children[0] = node->children[0]; + result.children[1] = node->children[1]; + return result; +} + +internal void +bsp_join_recursive(BSP* tree, BSP_Node_Id parent_id, BSP_Child_Selector keep) +{ + BSP_Node* parent = bsp_get(tree, parent_id); + BSP_Node keep_node = *bsp_get(tree, parent->children[keep]); + bsp_walk_preorder(tree, parent->children[0], bsp_free_cb, 0); + bsp_walk_preorder(tree, parent->children[1], bsp_free_cb, 0); + parent->user_data = keep_node.user_data; + zero_struct(parent->children[0]); + zero_struct(parent->children[1]); +} + +// NOTE(PS): the other three walk functions all require allocation of a stack +// while this is fast with our scratch allocator, there are cases where, for +// correctness, we walk a tree that is very likely to be a single node. In +// those cases, we can avoid allocating anything by just visiting the single +// node and returning early. +// This function provides that functionality for all walk functions +internal bool +bsp_walk_single_node_check(BSP* tree, BSP_Node_Id first, BSP_Walk_Cb* visit, u8* user_data) +{ + BSP_Node* node = bsp_get(tree, first); + if (node->split.kind == BSPSplit_None) + { + visit(tree, first, node, user_data); + return true; + } + return false; +} + +// left, parent, right +internal void +bsp_walk_inorder(BSP* tree, BSP_Node_Id first, BSP_Walk_Cb* visit, u8* user_data) +{ + if (!bsp_node_id_is_valid(first)) return; + if (bsp_walk_single_node_check(tree, first, visit, user_data)) return; + scratch_get(scratch); + BSP_Node_Id* stack = allocator_alloc_array(scratch.a, BSP_Node_Id, tree->nodes_len); + u32 stack_len = 0; + memory_zero_array(stack, BSP_Node_Id, tree->nodes_len); + + BSP_Node_Id at = first; + while (true) + { + if (bsp_node_id_is_valid(at)) + { + stack[stack_len++] = at; + BSP_Node* n = bsp_get(tree, at); + at = n->children[0]; + } + else + { + if (stack_len == 0) break; + + at = stack[--stack_len]; + BSP_Node* n = bsp_get(tree, at); + visit(tree, at, n, user_data); + at = n->children[1]; + } + } +} + +// parent, left right +internal void +bsp_walk_preorder(BSP* tree, BSP_Node_Id first, BSP_Walk_Cb* visit, u8* user_data) +{ + if (bsp_walk_single_node_check(tree, first, visit, user_data)) return; + scratch_get(scratch); + BSP_Node_Id* stack = allocator_alloc_array(scratch.a, BSP_Node_Id, tree->nodes_len); + u32 stack_len = 0; + memory_zero_array(stack, BSP_Node_Id, tree->nodes_len); + + BSP_Node_Id at = first; + + while (true) + { + while (bsp_node_id_is_valid(at)) + { + BSP_Node* n = bsp_get(tree, at); + visit(tree, at, n, user_data); + stack[stack_len++] = at; + at = n->children[0]; + } + + if (!bsp_node_id_is_valid(at) && stack_len == 0) break; + + at = stack[--stack_len]; + BSP_Node* n = bsp_get(tree, at); + at = n->children[1]; + } +} + +// parent, right, parent +internal void +bsp_walk_postorder(BSP* tree, BSP_Node_Id first, BSP_Walk_Cb* visit, u8* user_data) +{ + if (bsp_walk_single_node_check(tree, first, visit, user_data)) return; + scratch_get(scratch); + BSP_Node_Id* stack = allocator_alloc_array(scratch.a, BSP_Node_Id, tree->nodes_len); + u32 stack_len = 0; + memory_zero_array(stack, BSP_Node_Id, tree->nodes_len); + + BSP_Node_Id at = first; + while (true) + { + if (bsp_node_id_is_valid(at)) + { + BSP_Node* n = bsp_get(tree, at); + if (bsp_node_id_is_valid(n->children[1])) stack[stack_len++] = n->children[1]; + stack[stack_len++] = at; + at = n->children[0]; + } + else + { + if (stack_len == 0) break; + + at = stack[--stack_len]; + BSP_Node* n = bsp_get(tree, at); + assert(n != 0); + + if (bsp_node_id_is_valid(n->children[1]) && bsp_node_id_equals(n->children[1], stack[stack_len - 1])) + { + BSP_Node_Id at_temp = stack[stack_len - 1]; + stack[stack_len - 1] = at; + at = at_temp; + } + else + { + visit(tree, at, n, user_data); + zero_struct(at); + } + } + } +} + +internal void +bsp_node_update_child_areas(BSP* tree, BSP_Node_Id id, BSP_Node* node, u8* user_data) +{ + // assume that node's area is correct. Using that, clamp its split as appropriate + // and then update its children. If a child has an area of zero, rely on flags + // to determine behavior + + if (node->split.kind == BSPSplit_None) return; + + BSP_Split_Update_Flags flags = (BSP_Split_Update_Flags)0; + if (user_data) flags = *(BSP_Split_Update_Flags*)user_data; + + BSP_Split_Kind kind = node->split.kind; + + BSP_Node* node_min = bsp_get(tree, node->children[0]); + BSP_Node* node_max = bsp_get(tree, node->children[1]); + node_min->area = node->area; + node_max->area = node->area; + node_min->area.max.Elements[kind] = node->split.value; + node_max->area.min.Elements[kind] = node->split.value; + + if (has_flag(flags, BSPSplitUpdate_FreeZeroAreaChildren)) + { + bool free_children = false; + if (node_min->area.max.Elements[kind] <= node_min->area.min.Elements[kind]) + { + node->user_data = node_max->user_data; + free_children= true; + } + else if (node_max->area.max.Elements[kind] <= node_max->area.min.Elements[kind]) + { + node->user_data = node_min->user_data; + free_children= true; + } + + if (free_children) + { + bsp_walk_postorder(tree, node->children[0], bsp_free_cb, 0); + bsp_walk_postorder(tree, node->children[1], bsp_free_cb, 0); + } + + } + + // NOTE(PS): no need to recurse, this function assumes its either being + // called on a particular node or its the callback of one of the tree + // walk functions +} + +internal void +bsp_node_area_update(BSP* tree, BSP_Node_Id node_id, BSP_Area area) +{ + BSP_Node* node = bsp_get(tree, node_id); + node->area = area; + BSP_Split_Update_Flags flags = BSPSplitUpdate_FreeZeroAreaChildren; + bsp_walk_preorder(tree, node_id, bsp_node_update_child_areas, (u8*)&flags); +} + +internal void +bsp_child_split_update(BSP* tree, BSP_Node_Id node_id, r32 new_split, BSP_Split_Update_Flags flags) +{ + BSP_Node* node = bsp_get(tree, node_id); + node->split.value = new_split; + bsp_walk_preorder(tree, node_id, bsp_node_update_child_areas, (u8*)&flags); +} + +#if defined(DEBUG) + +internal void +bsp_tests() +{ + scratch_get(scratch); + BSP tree = bsp_create(scratch.a, 256); + tree.root = bsp_push(&tree, {0}, {{0,0},{512,512}}, 0); + + BSP_Split_Result r0 = bsp_split(&tree, tree.root, 256, BSPSplit_YAxis, 0, 0); + BSP_Node* root = bsp_get(&tree, tree.root); + BSP_Node* n0 = bsp_get(&tree, r0.children[0]); + BSP_Node* n1 = bsp_get(&tree, r0.children[1]); + assert(root != 0 && n0 != 0 && n1 != 0); + assert(n0->area.min == root->area.min); + assert(n0->area.max.x == 256 && n0->area.max.y == root->area.max.y); + assert(n1->area.max == root->area.max); + assert(n1->area.min.x == 256 && n0->area.min.y == root->area.min.y); + assert(n0->split.kind == BSPSplit_None); + assert(n1->split.kind == BSPSplit_None); + assert(root->split.kind == BSPSplit_YAxis); + + BSP_Split_Result r1 = bsp_split(&tree, root->children[0], 32, BSPSplit_YAxis, 0, 0); + BSP_Split_Result r2 = bsp_split(&tree, r1.children[1], 64, BSPSplit_XAxis, 0, 0); + + bsp_walk_postorder(&tree, root->children[0], bsp_free_cb, 0); +} + +#else + +#define bsp_tests() + +#endif + +#endif //LUMENARIUM_BSP_H diff --git a/src_v2/lumenarium_first.cpp b/src_v2/lumenarium_first.cpp index ea5f7d5..b4b0b36 100644 --- a/src_v2/lumenarium_first.cpp +++ b/src_v2/lumenarium_first.cpp @@ -6,12 +6,12 @@ lumenarium_init() { App_State* state = 0; - permanent = bump_allocator_create_reserve(GB(1)); - scratch = bump_allocator_create_reserve(KB(64)); + permanent = bump_allocator_create_reserve(GB(2)); + scratch_ = bump_allocator_create_reserve(GB(8)); platform_file_jobs_init(); run_tests(); - + scratch_get(scratch); App_Init_Desc desc = incenter_get_init_desc(); // TODO(PS): make sure the values make sense in desc @@ -21,6 +21,13 @@ lumenarium_init() state->input_state = input_state_create(permanent); + String exe_file_path = platform_get_exe_path(scratch.a); + u64 run_tree_start = string_find_substring(exe_file_path, lit_str("run_tree"), 0, StringMatch_FindLast); + u64 run_tree_end = run_tree_start + lit_str("run_tree").len; + String run_tree_path = string_get_prefix(exe_file_path, run_tree_end); + String run_tree_path_nullterm = string_copy(run_tree_path, scratch.a); + platform_pwd_set(run_tree_path_nullterm); + en_init(state, desc); if (has_flag(state->flags, AppState_RunEditor)) { @@ -33,7 +40,7 @@ lumenarium_init() internal void lumenarium_frame_prepare(App_State* state) { - allocator_clear(scratch); + allocator_clear(scratch_); input_state_swap_frames(state->input_state); @@ -50,7 +57,7 @@ lumenarium_frame_prepare(App_State* state) internal void lumenarium_frame(App_State* state) { - //en_frame(state); + en_frame(state); if (has_flag(state->flags, AppState_RunEditor)) { ed_frame(state); diff --git a/src_v2/lumenarium_first.h b/src_v2/lumenarium_first.h index 1d6c20c..85a5171 100644 --- a/src_v2/lumenarium_first.h +++ b/src_v2/lumenarium_first.h @@ -8,9 +8,17 @@ typedef struct App_State App_State; // Environment #include "lumenarium_memory.cpp" #include "lumenarium_string.cpp" +#include "lumenarium_random.h" #include "lumenarium_input.cpp" #include "lumenarium_texture_atlas.cpp" #include "lumenarium_hash.cpp" +#include "lumenarium_geometry.h" + +global Allocator* scratch_; // gets reset at frame boundaries + +#define scratch_get(ident) Allocator_Scratch ident = Allocator_Scratch(scratch_) + +#include "lumenarium_bsp.h" // Engine typedef struct Assembly_Strip Assembly_Strip; @@ -28,7 +36,6 @@ typedef struct Assembly_Strip Assembly_Strip; // Lumenarium Runtime Environment global Allocator* permanent; -global Allocator* scratch; // gets reset at frame boundaries #if defined(DEBUG) # include "lumenarium_tests.cpp" @@ -72,6 +79,7 @@ struct App_State #include "editor/lumenarium_editor_ui.cpp" #include "editor/lumenarium_editor_renderer.cpp" +#include "editor/lumenarium_editor_sculpture_visualizer.cpp" #include "editor/lumenarium_editor.cpp" diff --git a/src_v2/lumenarium_geometry.h b/src_v2/lumenarium_geometry.h new file mode 100644 index 0000000..abfe1ce --- /dev/null +++ b/src_v2/lumenarium_geometry.h @@ -0,0 +1,268 @@ +/* date = April 11th 2022 3:22 pm */ + +#ifndef LUMENARIUM_GEOMETRY_H +#define LUMENARIUM_GEOMETRY_H + +// Utility functions for working with 3d geometry + +// NOTE(PS): the Buffer vs Buffer_Builder distinction +// lets a static sized buffer exist, and be auto 'exported' or 'available' +// from a larger data structure that also stores enough data to incrementally +// build the buffer + +// NOTE(PS): @IMPORTANT!!! +// at the moment this builder doesn't support allowing for the elements +// of a vertex to be in an order other than position tex color +// and in any other packing than tightly packed +typedef u32 Geo_Vertex_Buffer_Storage; +enum +{ + GeoVertexBufferStorage_None = 0, + GeoVertexBufferStorage_Position = 1, + GeoVertexBufferStorage_TexCoord = 2, + GeoVertexBufferStorage_Color = 4 +}; + +struct Geo_Vertex_Buffer +{ + r32* values; + u32 len; + Geo_Vertex_Buffer_Storage storage; + u32 stride; +}; + +struct Geo_Vertex_Buffer_Builder +{ + union + { + Geo_Vertex_Buffer buffer; + struct + { + // NOTE(PS): @Maintainence + // this must always match the layout of Geo_Vertex_Buffer + r32* values; + u32 len; + Geo_Vertex_Buffer_Storage storage; + u32 stride; + }; + }; + u32 cap; +}; + +struct Geo_Index_Buffer +{ + u32* values; + u32 len; +}; + +struct Geo_Index_Buffer_Builder +{ + union + { + Geo_Index_Buffer buffer; + struct + { + // NOTE(PS): @Maintainence + // this must always match the layout of Geo_Index_Buffer + u32* values; + u32 len; + }; + }; + u32 cap; +}; + +struct Geo_Quad_Buffer +{ + Geo_Vertex_Buffer buffer_vertex; + Geo_Index_Buffer buffer_index; +}; + +struct Geo_Quad_Buffer_Builder +{ + Geo_Vertex_Buffer_Builder buffer_vertex; + Geo_Index_Buffer_Builder buffer_index; +}; + +internal Geo_Vertex_Buffer_Builder geo_vertex_buffer_builder_create(Allocator* a, u32 cap); +internal Geo_Index_Buffer_Builder geo_index_buffer_builder_create(Allocator* a, u32 cap); +internal Geo_Quad_Buffer_Builder geo_quad_buffer_builder_create(Allocator* a, u32 vertex_cap, u32 index_cap); + +// Vertex Buffer +internal u32 geo_vertex_buffer_builder_push(Geo_Vertex_Buffer_Builder* b, v3 v, v2 t, v4 c); +internal u32 geo_vertex_buffer_builder_push(Geo_Vertex_Buffer_Builder* b, v3 v, v2 t); +internal u32 geo_vertex_buffer_builder_push(Geo_Vertex_Buffer_Builder* b, v3 v); + +// Index Buffer +internal u32 geo_index_buffer_builder_push(Geo_Vertex_Buffer_Builder* b, u32 i); +internal void geo_index_buffer_builder_push_tri(Geo_Vertex_Buffer_Builder* b, u32 i0, u32 i1, u32 i2); +internal void geo_index_buffer_builder_push_quad(Geo_Vertex_Buffer_Builder* b, u32 i0, u32 i1, u32 i2, u32 i3); + +// Quad Buffer +internal void geo_quad_buffer_builder_push(Geo_Quad_Buffer_Builder* b, v3 p0, v3 p1, v3 p2, v3 p3, v2 t0, v2 t1, v2 t2, v2 t3, v4 c); +internal void geo_quad_buffer_builder_push(Geo_Quad_Buffer_Builder* b, v3 p0, v3 p1, v3 p2, v3 p3, v2 t0, v2 t1, v2 t2, v2 t3); +internal void geo_quad_buffer_builder_push(Geo_Quad_Buffer_Builder* b, v3 p0, v3 p1, v3 p2, v3 p3); +internal Geo_Quad_Buffer geo_quad_buffer_builder_get_static_buffer(Geo_Quad_Buffer_Builder* b); + +///////////////////////////////////////////// +// Implementation + +internal u32 +geo_vertex_buffer_builder_stride(Geo_Vertex_Buffer_Storage storage) +{ + u32 result = 0; + result += has_flag(storage, GeoVertexBufferStorage_Position) ? 3 : 0; + result += has_flag(storage, GeoVertexBufferStorage_TexCoord) ? 2 : 0; + result += has_flag(storage, GeoVertexBufferStorage_Color) ? 4 : 0; + return result; +} + +internal Geo_Vertex_Buffer_Builder +geo_vertex_buffer_builder_create(Allocator* a, u32 cap, Geo_Vertex_Buffer_Storage storage) +{ + u32 stride = geo_vertex_buffer_builder_stride(storage); + u32 size = cap * stride; + + Geo_Vertex_Buffer_Builder result = {}; + zero_struct(result); + result.cap = cap; + result.storage = storage; + result.stride = stride; + result.values = allocator_alloc_array(a, r32, size); + + return result; +} + +internal Geo_Index_Buffer_Builder +geo_index_buffer_builder_create(Allocator* a, u32 cap) +{ + + Geo_Index_Buffer_Builder result = {}; + zero_struct(result); + result.cap = cap; + result.values = allocator_alloc_array(a, u32, cap); + return result; +} + +internal Geo_Quad_Buffer_Builder +geo_quad_buffer_builder_create(Allocator* a, u32 vertex_cap, Geo_Vertex_Buffer_Storage storage, u32 index_cap) +{ + Geo_Quad_Buffer_Builder result = {}; + result.buffer_vertex = geo_vertex_buffer_builder_create(a, vertex_cap, storage); + result.buffer_index = geo_index_buffer_builder_create(a, index_cap); + return result; +} + +// Vertex Buffer + +internal u32 +geo_vertex_buffer_builder_push(Geo_Vertex_Buffer_Builder* b, v3 v, v2 t, v4 c) +{ + assert(b->len < b->cap); + u32 result = b->len++; + u32 offset = result * b->stride; + if (has_flag(b->storage, GeoVertexBufferStorage_Position)) + { + b->values[offset++] = v.x; + b->values[offset++] = v.y; + b->values[offset++] = v.z; + } + if (has_flag(b->storage, GeoVertexBufferStorage_TexCoord)) + { + b->values[offset++] = t.x; + b->values[offset++] = t.y; + } + if (has_flag(b->storage, GeoVertexBufferStorage_Color)) + { + b->values[offset++] = c.x; + b->values[offset++] = c.y; + b->values[offset++] = c.z; + b->values[offset++] = c.w; + } + return result; +} + +internal u32 +geo_vertex_buffer_builder_push(Geo_Vertex_Buffer_Builder* b, v3 v, v2 t) +{ + return geo_vertex_buffer_builder_push(b, v, t, v4{0}); +} + +internal u32 +geo_vertex_buffer_builder_push(Geo_Vertex_Buffer_Builder* b, v3 v) +{ + return geo_vertex_buffer_builder_push(b, v, v2{0}, v4{0}); +} + + +// Index Buffer + +internal u32 +geo_index_buffer_builder_push(Geo_Index_Buffer_Builder* b, u32 i) +{ + assert(b->len < b->cap); + u32 result = b->len++; + b->values[result] = i; + return result; +} + +internal void +geo_index_buffer_builder_push_tri(Geo_Index_Buffer_Builder* b, u32 i0, u32 i1, u32 i2) +{ + geo_index_buffer_builder_push(b, i0); + geo_index_buffer_builder_push(b, i1); + geo_index_buffer_builder_push(b, i2); +} + +internal void +geo_index_buffer_builder_push_quad(Geo_Index_Buffer_Builder* b, u32 i0, u32 i1, u32 i2, u32 i3) +{ + geo_index_buffer_builder_push_tri(b, i0, i1, i2); + geo_index_buffer_builder_push_tri(b, i0, i2, i3); +} + + +// Quad Buffer + +internal void +geo_quad_buffer_builder_push(Geo_Quad_Buffer_Builder* b, v3 p0, v3 p1, v3 p2, v3 p3, v2 t0, v2 t1, v2 t2, v2 t3, v4 c) +{ + u32 i0 = geo_vertex_buffer_builder_push(&b->buffer_vertex, p0, t0, c); + u32 i1 = geo_vertex_buffer_builder_push(&b->buffer_vertex, p1, t1, c); + u32 i2 = geo_vertex_buffer_builder_push(&b->buffer_vertex, p2, t2, c); + u32 i3 = geo_vertex_buffer_builder_push(&b->buffer_vertex, p3, t3, c); + + geo_index_buffer_builder_push_quad(&b->buffer_index, i0, i1, i2, i3); +} + +internal void +geo_quad_buffer_builder_push(Geo_Quad_Buffer_Builder* b, v3 p0, v3 p1, v3 p2, v3 p3, v2 t0, v2 t1, v2 t2, v2 t3) +{ + u32 i0 = geo_vertex_buffer_builder_push(&b->buffer_vertex, p0, t0, v4{}); + u32 i1 = geo_vertex_buffer_builder_push(&b->buffer_vertex, p1, t1, v4{}); + u32 i2 = geo_vertex_buffer_builder_push(&b->buffer_vertex, p2, t2, v4{}); + u32 i3 = geo_vertex_buffer_builder_push(&b->buffer_vertex, p3, t3, v4{}); + + geo_index_buffer_builder_push_quad(&b->buffer_index, i0, i1, i2, i3); +} + +internal void +geo_quad_buffer_builder_push(Geo_Quad_Buffer_Builder* b, v3 p0, v3 p1, v3 p2, v3 p3) +{ + u32 i0 = geo_vertex_buffer_builder_push(&b->buffer_vertex, p0, v2{}, v4{}); + u32 i1 = geo_vertex_buffer_builder_push(&b->buffer_vertex, p1, v2{}, v4{}); + u32 i2 = geo_vertex_buffer_builder_push(&b->buffer_vertex, p2, v2{}, v4{}); + u32 i3 = geo_vertex_buffer_builder_push(&b->buffer_vertex, p3, v2{}, v4{}); + + geo_index_buffer_builder_push_quad(&b->buffer_index, i0, i1, i2, i3); +} + +internal Geo_Quad_Buffer +geo_quad_buffer_builder_get_static_buffer(Geo_Quad_Buffer_Builder* b) +{ + Geo_Quad_Buffer result = {}; + result.buffer_vertex = b->buffer_vertex.buffer; + result.buffer_index = b->buffer_index.buffer; + return result; +} + +#endif //LUMENARIUM_GEOMETRY_H diff --git a/src_v2/lumenarium_memory.cpp b/src_v2/lumenarium_memory.cpp index 103396f..a133df8 100644 --- a/src_v2/lumenarium_memory.cpp +++ b/src_v2/lumenarium_memory.cpp @@ -195,6 +195,16 @@ bump_allocator_destroy(Allocator* allocator) allocator_destroy_(allocator, sizeof(Allocator_Bump)); } +internal void +bump_allocator_rewind(Allocator* allocator, u64 to_point) +{ + Allocator_Bump* bump = (Allocator_Bump*)allocator->allocator_data; +#if defined(DEBUG) + memory_zero(bump->base + to_point, bump->at - to_point); +#endif + bump->at = to_point; +} + internal Allocator* bump_allocator_create_() { @@ -248,6 +258,28 @@ bump_allocator_create_child(Allocator* parent, u64 init_size) return result; } + +///////////////////////////////////////// +// Scratch Allocator + +struct Allocator_Scratch +{ + Allocator* a; + u64 at_before; + + Allocator_Scratch(Allocator* allocator) + { + this->a = allocator; + Allocator_Bump* bump = (Allocator_Bump*)this->a->allocator_data; + this->at_before = bump->at; + } + + ~Allocator_Scratch() + { + bump_allocator_rewind(this->a, this->at_before); + } +}; + ///////////////////////////////////////// // Paged Allocator diff --git a/src_v2/lumenarium_random.h b/src_v2/lumenarium_random.h new file mode 100644 index 0000000..625a842 --- /dev/null +++ b/src_v2/lumenarium_random.h @@ -0,0 +1,47 @@ +/* date = April 11th 2022 6:11 pm */ + +#ifndef LUMENARIUM_RANDOM_H +#define LUMENARIUM_RANDOM_H + +struct Random_Series +{ + u32 last_value; +}; + +internal Random_Series +random_series_create(u32 seed) +{ + Random_Series result = {}; + result.last_value = seed; + return result; +} + +internal u32 +random_series_next(Random_Series* s) +{ + u32 result = s->last_value; + result ^= result << 13; + result ^= result >> 17; + result ^= result << 5; + s->last_value = result; + return result; +} + +internal r32 +random_series_next_unilateral(Random_Series* s) +{ + r32 result = random_series_next(s) / (r32)(0xFFFFFFFF); + return result; +} + +internal r32 +random_series_next_bilateral(Random_Series* s) +{ + r32 result = random_series_next(s) / (r32)(0xFFFFFFFF); + result = (result * 2.0f) - 1.0f; + return result; +} + + + +#endif //LUMENARIUM_RANDOM_H diff --git a/src_v2/lumenarium_string.cpp b/src_v2/lumenarium_string.cpp index e9f2a8b..6c6ed7e 100644 --- a/src_v2/lumenarium_string.cpp +++ b/src_v2/lumenarium_string.cpp @@ -250,9 +250,9 @@ string_fv(Allocator* a, char* fmt, va_list args) { va_list args1; va_copy(args1, args); - s32 needed = vsnprintf(0, 0, fmt, args); + s32 needed = stbsp_vsnprintf(0, 0, fmt, args); String result = allocator_alloc_string(a, needed + 1); - result.len = vsnprintf((char*)result.str, result.cap, fmt, args1); + result.len = stbsp_vsnprintf((char*)result.str, (int)result.cap, fmt, args1); result.str[result.len] = 0; va_end(args1); return result; diff --git a/src_v2/lumenarium_tests.cpp b/src_v2/lumenarium_tests.cpp index a7f99f5..6379b7b 100644 --- a/src_v2/lumenarium_tests.cpp +++ b/src_v2/lumenarium_tests.cpp @@ -70,7 +70,12 @@ memory_tests() { // TestGroup("Platform Allocation") { - u8* base = platform_mem_reserve(GB(32)); + u64 size = GB(32); +#if defined(PLATFORM_wasm) + size = KB(4); +#endif + + u8* base = platform_mem_reserve(size); platform_mem_commit(base, KB(4)); base[4095] = 200; assert(base[4095] == 200); @@ -85,18 +90,54 @@ memory_tests() memory_allocator_tests(bump, false); allocator_destroy(bump); - Allocator* paged = paged_allocator_create_reserve(KB(32)); + Allocator* paged = paged_allocator_create_reserve(KB(32), KB(4)); memory_allocator_tests(paged, true); allocator_destroy(paged); } +enum test_flags +{ + TestNone = 0, + Test1 = 1, + Test2 = 2, + Test3 = 4, + Test4 = 8, +}; + internal void run_tests() { + scratch_get(scratch); + + // basic + + u8 b = TestNone; + assert(!has_flag(b, TestNone)); + assert(!has_flag(b, Test1)); + add_flag(b, Test1); + assert(has_flag(b, Test1)); + assert(!has_flag(b, Test2)); + add_flag(b, Test2); + assert(has_flag(b, Test1)); + assert(has_flag(b, Test2)); + assert(has_flag(b, Test1 | Test2)); + add_flag(b, Test4); + assert(has_flag(b, Test1)); + assert(has_flag(b, Test2)); + assert(has_flag(b, Test4)); + assert(has_flag(b, Test1 | Test2 | Test4)); + assert(!has_flag(b, Test3)); + rem_flag(b, Test2); + assert(has_flag(b, Test1)); + assert(!has_flag(b, Test2)); + assert(has_flag(b, Test4)); + assert(has_flag(b, Test1 | Test4)); + assert(!has_flag(b, Test3)); + // memory tests - u8* a0 = allocator_alloc_array(scratch, u8, 32); - u8* a1 = allocator_alloc_array(scratch, u8, 32); + u8* a0 = allocator_alloc_array(scratch.a, u8, 32); + u8* a1 = allocator_alloc_array(scratch.a, u8, 32); assert(a0 != a1); assert((a0 + 32) <= a1); @@ -113,7 +154,15 @@ run_tests() assert(a1[i] == (100 + i)); } + + assert(round_up_to_pow2(1) == 1); + assert(round_up_to_pow2(3) == 4); + assert(round_up_to_pow2(29) == 32); + assert(round_up_to_pow2(32) == 32); + assert(round_up_to_pow2(120) == 128); + memory_tests(); + bsp_tests(); #if defined(PLATFORM_wasm) // NOTE(PS): the tests below this point don't make sense on a web assembly @@ -123,21 +172,21 @@ run_tests() // testing strings and exe path - String exe_file_path = platform_get_exe_path(scratch); + String exe_file_path = platform_get_exe_path(scratch.a); assert(exe_file_path.str != 0); u64 run_tree_start = string_find_substring(exe_file_path, lit_str("run_tree"), 0, StringMatch_FindLast); u64 run_tree_end = run_tree_start + lit_str("run_tree").len; assert(run_tree_start < exe_file_path.len); String run_tree_path = string_get_prefix(exe_file_path, run_tree_end); - String run_tree_path_nullterm = string_copy(run_tree_path, scratch); + String run_tree_path_nullterm = string_copy(run_tree_path, scratch.a); assert(run_tree_path_nullterm.len > 0); assert(platform_pwd_set(run_tree_path_nullterm)); // testing file io Platform_File_Handle f = platform_file_open(lit_str("text.txt"), FileAccess_Read | FileAccess_Write, FileCreate_OpenExisting); - Platform_File_Info i = platform_file_get_info(f, scratch); + Platform_File_Info i = platform_file_get_info(f, scratch.a); - Data d0 = platform_file_read_all(f, scratch); + Data d0 = platform_file_read_all(f, scratch.a); assert(d0.size > 0); String s = lit_str("foooooooooobbbbbbaaaarrrrrr"); @@ -163,6 +212,4 @@ run_tests() } #endif - allocator_clear(scratch); - } \ No newline at end of file diff --git a/src_v2/lumenarium_types.h b/src_v2/lumenarium_types.h index 8851563..988b636 100644 --- a/src_v2/lumenarium_types.h +++ b/src_v2/lumenarium_types.h @@ -37,6 +37,41 @@ typedef s64 b64; typedef float r32; typedef double r64; +#define u8_max 0xFF +#define u16_max 0xFFFF +#define u32_max 0xFFFFFFFF +#define u64_max 0xFFFFFFFFFFFFFFFF + +#define s8_max 127 +#define s16_max 32767 +#define s32_max 2147483647 +#define s64_max 9223372036854775807 + +#define s8_min -127 - 1 +#define s16_min -32767 - 1 +#define s32_min -2147483647 - 1 +#define s64_min -9223372036854775807 - 1 + +#define r32_max 3.402823466e+38f +#define r32_min -3.402823466e+38f +#define r32_smallest_positive 1.1754943508e-38f +#define r32_epsilon 5.96046448e-8f +#define r32_pi 3.14159265359f +#define r32_half_pi 1.5707963267f +#define r32_tau 6.28318530717f + +#define r64_max 1.79769313486231e+308 +#define r64_min -1.79769313486231e+308 +#define r64_smallest_positive 4.94065645841247e-324 +#define r64_epsilon 1.11022302462515650e-16 +#define r64_pi 3.14159265359 +#define r64_half_pi 1.5707963267 +#define r64_tau 6.28318530717 + +#define NanosToSeconds 1 / 10000000.0 +#define SecondsToNanos 10000000.0 + + #define get_byte(value, byte_index) ((value >> (8 * byte_index)) & 0xFF) struct Data @@ -54,12 +89,21 @@ data_create(u8* base, u64 size) return result; } +#define memory_zero_array(b,t,c) memory_zero((u8*)(b), sizeof(t) * (c)) internal void memory_zero(u8* base, u64 size); internal void memory_copy(u8* from, u8* to, u64 size); ////////////////////////////////////////////// // Math +#ifndef max +# define max(a,b) (a) > (b) ? (a) : (b) +#endif + +#ifndef min +# define min(a,b) (a) > (b) ? (b) : (a) +#endif + #define lerp(a,t,b) (a) + ((1.0f - (t)) * (b)) #define clamp(r0,v,r1) min((r1),max((r0),(v))) #define lerp_clamp(a,t,b) clamp((a),lerp((a),(t),(b)),(b)) @@ -247,6 +291,22 @@ hash_table_find(u32* ids, u32 cap, u32 value) return result; } +////////////////////////////////////////////// +// Math + +internal u32 +round_up_to_pow2(u32 v) +{ + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + return v; +} + ////////////////////////////////////////////// // Vector Extensions @@ -254,6 +314,15 @@ hash_table_find(u32* ids, u32 cap, u32 value) #define v2_floor(v) v2{ floorf(v.x), floorf(v.y) } #define v3_floor(v) v3{ floorf(v.x), floorf(v.y), floorf(v.z) } +internal bool +rect2_contains(v2 min, v2 max, v2 point) +{ + return ( + min.x <= point.x && min.y <= point.y && + max.x >= point.x && max.y >= point.y + ); +} + ////////////////////////////////////////////// // Color Constants diff --git a/src_v2/platform/lumenarium_platform.h b/src_v2/platform/lumenarium_platform.h index 4f06e9c..fff914d 100644 --- a/src_v2/platform/lumenarium_platform.h +++ b/src_v2/platform/lumenarium_platform.h @@ -85,12 +85,12 @@ bool platform_pwd_set(String path); typedef u32 Platform_File_Async_Job_Flags; enum { - PlatformFileAsyncJob_Invalid = 0, - PlatformFileAsyncJob_Read = 1, - PlatformFileAsyncJob_Write = 2, - PlatformFileAsyncJob_InFlight = 4, - PlatformFileAsyncJob_Success = 8, - PlatformFileAsyncJob_Failed = 16, + PlatformFileAsyncJob_Invalid = 0, + PlatformFileAsyncJob_Read = 1 << 0, + PlatformFileAsyncJob_Write = 1 << 1, + PlatformFileAsyncJob_InFlight = 1 << 2, + PlatformFileAsyncJob_Success = 1 << 3, + PlatformFileAsyncJob_Failed = 1 << 4, }; struct Platform_File_Async_Job_Args diff --git a/src_v2/platform/lumenarium_platform_common_includes.h b/src_v2/platform/lumenarium_platform_common_includes.h index 1b6799a..f6e0496 100644 --- a/src_v2/platform/lumenarium_platform_common_includes.h +++ b/src_v2/platform/lumenarium_platform_common_includes.h @@ -17,6 +17,9 @@ #define STBTT_assert(x) assert(x) #include "../libs/stb_truetype.h" +#define STB_SPRINTF_IMPLEMENTATION +#include "../libs/stb_sprintf.h" + // NOTE(PS): only need the opengl extension headers // when running on a platform that is using opengl 3.3+ #if !defined(PLATFORM_wasm) diff --git a/src_v2/platform/wasm/lumenarium_first_wasm.cpp b/src_v2/platform/wasm/lumenarium_first_wasm.cpp index 8446aa6..6e60e26 100644 --- a/src_v2/platform/wasm/lumenarium_first_wasm.cpp +++ b/src_v2/platform/wasm/lumenarium_first_wasm.cpp @@ -9,6 +9,7 @@ #include "../lumenarium_platform_common_includes.h" #include "../../lumenarium_types.h" +#include "../../lumenarium_memory.h" #include "../lumenarium_platform.h" #include "../../lumenarium_first.cpp" diff --git a/src_v2/platform/wasm/lumenarium_wasm_file.cpp b/src_v2/platform/wasm/lumenarium_wasm_file.cpp index ef11ded..4cf4aad 100644 --- a/src_v2/platform/wasm/lumenarium_wasm_file.cpp +++ b/src_v2/platform/wasm/lumenarium_wasm_file.cpp @@ -1,5 +1,6 @@ WASM_EXTERN u32 wasm_fetch(char* file_path, u32 file_path_len, u8* dest, u32 size); +WASM_EXTERN void wasm_platform_file_async_work_on_job(char* path, u32 path_len, u8* data, u32 data_len, bool read, bool write); Platform_File_Handle platform_file_open(String path, Platform_File_Access_Flags flags_access, Platform_File_Create_Flags flags_create) @@ -43,3 +44,13 @@ platform_pwd_set(String path) return false; } +void +platform_file_async_work_on_job(Platform_File_Async_Job* job) +{ + wasm_platform_file_async_work_on_job( + (char*)job->args.path.str, job->args.path.len, + job->args.data.base, job->args.data.size, + has_flag(job->args.flags, PlatformFileAsyncJob_Read), + has_flag(job->args.flags, PlatformFileAsyncJob_Write) + ); +} \ No newline at end of file diff --git a/src_v2/platform/wasm/lumenarium_wasm_imports.js b/src_v2/platform/wasm/lumenarium_wasm_imports.js index 29d372c..ff42920 100644 --- a/src_v2/platform/wasm/lumenarium_wasm_imports.js +++ b/src_v2/platform/wasm/lumenarium_wasm_imports.js @@ -92,20 +92,69 @@ var lumenarium_wasm_imports = { }, wasm_mem_grow: (new_size) => { - let pages = new_size / WASM_PAGE_SIZE; + let new_size_ = new_size >>> 0; + let pages = new_size_ / WASM_PAGE_SIZE; let pages_rem = fract(pages); if (pages_rem > 0) pages = Math.floor(pages) + 1; let size_before = lumenarium_wasm_instance.exports.memory.buffer.byteLength; let old_page_count = lumenarium_wasm_instance.exports.memory.grow(pages); console.log("mem_grow\n", - "req size: ", new_size, "\n", + "req size: ", new_size_, "\n", "old size: ", (old_page_count * WASM_PAGE_SIZE), "\n", "old size: ", size_before, "\n", "grew by: ", (pages * WASM_PAGE_SIZE), "\n", "new size: ", lumenarium_wasm_instance.exports.memory.buffer.byteLength, ""); }, + malloc: (size) => { + + }, + + free: (base) => { + + }, + + sin: Math.sin, + sinf: Math.sin, + cos: Math.cos, + cosf: Math.cos, + tan: Math.tan, + tanf: Math.tan, + asin: Math.asin, + asinf: Math.asin, + acos: Math.acos, + acosf: Math.acos, + atan: Math.atan, + atanf: Math.atan, + pow: Math.pow, + powf: Math.pow, + fmodf: (f,d) => { return f % d; }, + strlen: (ptr) => { + let len = 0; + let len_checked = 0; + let len_to_check = 256; + let found_end = false; + while (true) + { + let string = wasm_mem_get_u8_arr(lumenarium_wasm_instance, ptr, len_checked); + for (let i = len_checked; i < len_to_check; i++) + { + if (string[i] == 0) + { + len = i; + break; + } + } + len_checked *= 2; + } + return len_checked; + }, + + wasm_platform_file_async_work_on_job: (path, path_len, data, data_size, read, write) => { + + }, + wasm_performance_now: () => { return performance.now(); }, @@ -260,6 +309,14 @@ function glBufferData(target, size, ptr, usage) return r; } +function glBufferSubData(target, offset, size, ptr) +{ + let data = wasm_mem_get_u8_arr(lumenarium_wasm_instance, ptr, size); + const r = gl.bufferSubData(target, offset, data, 0, size); + glErrorReport(arguments); + return r; +} + function glCreateShader(kind) { let shader = gl.createShader(kind); @@ -395,6 +452,17 @@ function glTexSubImage2D(target, level, offsetx, offsety, width, height, format, return r; } +function glGetUniformLocation(program, name, name_len) +{ + // TODO(PS): complete + return 0; +} + +function glUniformMatrix4fv() +{ + // TODO(PS): +} + function webgl_add_imports (canvas_selector, imports) { const canvas = document.querySelector(canvas_selector); if (!canvas) return console.error("no canvas"); @@ -414,6 +482,7 @@ function webgl_add_imports (canvas_selector, imports) { imports.glCreateBuffer = glCreateBuffer; imports.glBindBuffer = glBindBuffer; imports.glBufferData = glBufferData; + imports.glBufferSubData = glBufferSubData; imports.glCreateShader = glCreateShader; imports.glShaderSource = glShaderSource; imports.glCompileShader = glCompileShader; @@ -431,5 +500,8 @@ function webgl_add_imports (canvas_selector, imports) { imports.glTexImage2D = glTexImage2D; imports.glTexSubImage2D = glTexSubImage2D; imports.glBindTexture = glBindTexture; + imports.glGetUniformLocation = glGetUniformLocation; + imports.glUniformMatrix4fv = glUniformMatrix4fv; + return imports; } \ No newline at end of file diff --git a/src_v2/platform/wasm/lumenarium_wasm_webgl.cpp b/src_v2/platform/wasm/lumenarium_wasm_webgl.cpp index 55a8efd..e17ff7f 100644 --- a/src_v2/platform/wasm/lumenarium_wasm_webgl.cpp +++ b/src_v2/platform/wasm/lumenarium_wasm_webgl.cpp @@ -48,6 +48,7 @@ typedef unsigned int GLsizei; #define GL_RGB 0x1907 #define GL_RGBA 0x1908 #define GL_UNSIGNED_BYTE 0x1401 +#define GL_CLAMP_TO_EDGE 0x812F WASM_EXTERN bool glHadError(); WASM_EXTERN void glClearColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a); @@ -61,6 +62,7 @@ WASM_EXTERN void glClear(GLuint i); WASM_EXTERN GLuint glCreateBuffer(); WASM_EXTERN void glBindBuffer(GLenum buffer_kind, GLuint buffer_id); WASM_EXTERN void glBufferData(GLenum target, size_t size, const void* data, GLenum usage); +WASM_EXTERN void glBufferSubData(GLenum target, size_t offset, size_t size, const void* data); WASM_EXTERN GLuint glCreateShader(GLenum kind); WASM_EXTERN GLuint glShaderSource(GLuint shader_id, char* shader_code, GLuint shader_code_len); WASM_EXTERN void glCompileShader(GLuint shader_id); @@ -70,6 +72,7 @@ WASM_EXTERN void glLinkProgram(GLuint program); WASM_EXTERN void glUseProgram(GLuint program); WASM_EXTERN GLuint glGetAttribLocation(GLuint program, const char* name, GLuint name_len); WASM_EXTERN GLuint glGetUniformLocation(GLuint program, const char* name, u32 len); +WASM_EXTERN void glUniformMatrix4fv(GLuint uniform, GLuint count, GLenum normalize, GLfloat* elements); WASM_EXTERN void glVertexAttribPointer(GLuint attr, GLuint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); WASM_EXTERN void glEnableVertexAttribArray(GLuint index); WASM_EXTERN void glDrawElements(GLenum type, GLuint count, GLenum ele_type, void* indices); @@ -109,6 +112,53 @@ platform_geometry_buffer_create( return result; } +void +platform_geometry_buffer_update( + Platform_Geometry_Buffer* buffer, + r32* verts, + u32 verts_offset, + u32 verts_len, + u32* indices, + u32 indices_offset, + u32 indices_len + ){ + glBindBuffer(GL_ARRAY_BUFFER, buffer->buffer_id_vertices); + if (verts_len > buffer->vertices_len) + { + // NOTE(PS): this is because we're going to delete the old buffer and + // create a new one. In order to do that and not lose data, the update + // function needs to have been passed all the buffer's data + assert(verts_offset == 0); + glBufferData( + GL_ARRAY_BUFFER, verts_len * sizeof(r32), (void*)verts, GL_STATIC_DRAW + ); + } + else + { + glBufferSubData( + GL_ARRAY_BUFFER, verts_offset * sizeof(r32), verts_len * sizeof(r32), (void*)verts + ); + } + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer->buffer_id_indices); + if (indices_len > buffer->indices_len) + { + // NOTE(PS): this is because we're going to delete the old buffer and + // create a new one. In order to do that and not lose data, the update + // function needs to have been passed all the buffer's data + assert(indices_offset == 0); + glBufferData( + GL_ELEMENT_ARRAY_BUFFER, indices_len * sizeof(u32), (void*)indices, GL_STATIC_DRAW + ); + } + else + { + glBufferSubData( + GL_ELEMENT_ARRAY_BUFFER, indices_offset * sizeof(u32), indices_len * sizeof(u32), (void*)indices + ); + } +} + Platform_Shader platform_shader_create( String code_vert, String code_frag, String* attrs, GLuint attrs_len, String* uniforms, GLuint uniforms_len @@ -174,7 +224,7 @@ platform_shader_bind(Platform_Shader shader) void platform_set_uniform(Platform_Shader shader, u32 index, m44 u) { - glUniformMatrix4fv(shader.uniforms[index], 1, GL_FALSE, &u.Elements[0]); + glUniformMatrix4fv(shader.uniforms[index], 1, GL_FALSE, (r32*)u.Elements); } void diff --git a/src_v2/platform/win32/lumenarium_first_win32.cpp b/src_v2/platform/win32/lumenarium_first_win32.cpp index 9dc68a8..df682e2 100644 --- a/src_v2/platform/win32/lumenarium_first_win32.cpp +++ b/src_v2/platform/win32/lumenarium_first_win32.cpp @@ -205,8 +205,8 @@ WinMain( &win32_main_window, hInstance, "Lumenariumtest0", - 1600, - 900, + 1400, + 800, win32_window_event_handler ); win32_window_update_dim(&win32_main_window); diff --git a/src_v2/platform/win32/lumenarium_win32_graphics.cpp b/src_v2/platform/win32/lumenarium_win32_graphics.cpp index cb02e6b..354bf93 100644 --- a/src_v2/platform/win32/lumenarium_win32_graphics.cpp +++ b/src_v2/platform/win32/lumenarium_win32_graphics.cpp @@ -57,15 +57,16 @@ platform_geometry_buffer_create( return result; } -void platform_geometry_buffer_update( - Platform_Geometry_Buffer* buffer, - r32* verts, - u32 verts_offset, - u32 verts_len, - u32* indices, - u32 indices_offset, - u32 indices_len - ){ +void +platform_geometry_buffer_update( + Platform_Geometry_Buffer* buffer, + r32* verts, + u32 verts_offset, + u32 verts_len, + u32* indices, + u32 indices_offset, + u32 indices_len + ){ gl.glBindVertexArray(buffer->buffer_id_vao); gl.glBindBuffer(GL_ARRAY_BUFFER, buffer->buffer_id_vertices); win32_gl_no_error(); diff --git a/src_v2/user_space/user_space_incenter.cpp b/src_v2/user_space/user_space_incenter.cpp index 124f476..8a894c2 100644 --- a/src_v2/user_space/user_space_incenter.cpp +++ b/src_v2/user_space/user_space_incenter.cpp @@ -7,33 +7,53 @@ incenter_get_init_desc() return result; } +#define INCENTER_METER 1.0f +#define INCENTER_FOOT 0.3048f +#define INCENTER_METERS(count) (count) * INCENTER_METER +#define INCENTER_FEET(count) (count) * INCENTER_FOOT +#define INCENTER_PER_METER(count) INCENTER_METER / (r32)(count) + internal void incenter_init(App_State* state) { // create a fake sculpture - Assembly_Handle ah = assembly_add(&state->assemblies, lit_str("test"), 3000, 100); + Assembly_Handle ah = assembly_add(&state->assemblies, lit_str("test"), 5043, 41); - r32 scale = 1; + scratch_get(scratch); + Allocator* s = scratch.a; - // strips - for (int strip_x = 0; strip_x < 10; strip_x++) + v3 start_p = v3{0, 0, 0}; + + Assembly_Strip* vertical_strip = assembly_add_strip(&state->assemblies, ah, 123); + assembly_strip_create_leds( + &state->assemblies, + ah, + vertical_strip, + start_p, + v3{0, INCENTER_FEET(-6.5f), 0}, + 123 + ); + + r32 radius = INCENTER_FEET(10); + + Random_Series rand = random_series_create(hash_djb2_to_u32("slkdjfalksdjf")); + for (u32 i = 0; i < 40; i++) { - for (int strip_y = 0; strip_y < 10; strip_y++) - { - if (strip_x == 5 && strip_y == 7) - { - int x= 5; - } - Assembly_Strip* strip = assembly_add_strip(&state->assemblies, ah, 30); - - // leds go up - for (int led_z = 0; led_z < 30; led_z++) - { - v4 pos = { strip_x * scale, strip_y * scale, led_z * scale, 1 }; - assembly_add_led(&state->assemblies, ah, strip, pos); - } - } + Assembly_Strip* strip = assembly_add_strip(&state->assemblies, ah, 123); + + r32 theta = random_series_next_unilateral(&rand) * r32_tau; + r32 phi = random_series_next_unilateral(&rand) * r32_tau; + + // spherical to cartesian conversion + v3 end_p = { + radius * sinf(phi) * cosf(theta), + radius * sinf(phi) * sinf(theta), + radius * cosf(phi) + }; + assembly_strip_create_leds(&state->assemblies, ah, strip, start_p, end_p, 123); } + + ed_sculpture_updated(state, 5, 0.025f); } internal void